|
程序如下:# s5 O+ n3 F ], l7 a$ P8 ]! r$ q, N
6 ~ u9 E( K) H+ A& w
操作系統(tǒng): win7 64位
# o" J8 I7 Q9 \4 A2 |1 u r) ?6 rIDE:VC++2010旗艦版9 L; h8 b4 G: e. B. |2 H
視覺軟件: OPENCV 3.0
/ v8 o) n! u7 K5 i' C* Z) [
4 L$ ^, \; z# t. }$ S9 z, }5 H7 z
//#include "stdafx.h"# t, [4 n: r& u. O' `1 ~
#include "core/core.hpp"
* e1 ~( R3 p4 T- j#include <opencv2/imgproc/imgproc.hpp>+ e; {; X# I9 v# n. n
#include <opencv2/highgui/highgui.hpp>7 ?: \1 |6 H# b E
#include <iostream>& z- M/ n7 A6 {. V1 [* M5 `
#include "highgui.h"6 j; z" J o0 h/ i. i5 n( z
#include <set>* k- O4 D5 [, ]7 g
#include <opencv2\opencv.hpp>
8 Q/ p& j/ X+ G- {#include<vector> //包含所需要的類文件vector,還有一定要加上using namespace std,。
& U( f2 [$ k0 K; C; y/ L$ l#include <stdio.h>6 U2 c: y- g* I% z& u5 s! i
#include <conio.h>% B: Q4 F' ^% h5 i: S; ^
#include <opencv2/highgui/highgui_c.h>
5 m& C, Z* s* O#include <math.h>
C& g. F9 a7 Q$ p1 E+ ~) K+ ?#include "iostream") h, x- v1 a9 n* {" s% I3 j- J
#include "cv.h"( J5 G8 I% d' N! X8 H# }# e% x! M
#include "highgui.h"& S* F, n. ^7 R6 a: X
using namespace std;6 O1 i8 C& f+ s1 T
using namespace cv;
) D" Z: R8 T, a) ~6 |$ Q2 ^% z5 @7 z
$ K; |( [) P* v4 Q \
1 f1 V k4 P& O0 E! N4 U! J
. |8 i' {" V @9 V9 l//-----------------------------------【main( )函數(shù)】--------------------------------------------
: N: c$ m7 ~( Q0 s. ^// 描述:控制臺應(yīng)用程序的入口函數(shù),,我們的程序從這里開始4 |6 d4 k* W! T! E7 ~2 e
//-------------------------------------------------------------------------------------------------
3 u- e7 ~1 V7 {) A0 ~; l4 u2 |5 r% ^5 h8 J3 M0 P
int main()2 g# v) f7 ?1 |* ?- F& Z- E$ i# j
- i; N3 \9 L3 Z( g& r& s{
& [' L& T* u$ o& l/ O! r% Jint chufa=1;* A- X& `" E: V6 }: v/ v
//【1】從攝像頭讀入視頻
. N5 i' L4 G% v* d8 c
; ?! E* e$ o' Z! k1 L VideoCapture capture(0);9 M# R @( Y4 h( F0 E
% R2 U# U3 D8 Z3 f# `" g5 f k
Mat edges; //定義類
+ V Y1 R9 e4 V* o' \
2 S1 z5 ?. X" k( C4 I9 JnamedWindow("預(yù)處理后的視頻", 0);
* H2 q. e! ?" b2 U& u0 R
9 P* h- S$ \3 I, O" n5 K9 d& Q // Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,,將該項至于循環(huán)之外,,不要重復(fù)定義Mat,增快速度,;; R/ m" y' s% G# \0 c% U
$ ], x6 w4 h2 [5 z4 u
//定義輪廓和層次結(jié)構(gòu)(這個不是很理解)
7 `+ b4 q9 J4 g- W
2 s0 J, b/ y+ A9 }//vector<vector<Point>>contours; //其中contours 應(yīng)該是一個變量,,可以用在后面的輪廓查找的函數(shù)中,定義點的向量
" p7 n1 P3 U% ]! M6 r" i8 P+ V$ S& j
//vector<Vec4i>hierarchy; //定義四維向量,?,??4 \8 N5 X* u" o' y$ V9 L
1 c2 l/ r# V3 L! m9 v//【2】循環(huán)顯示每一幀; b9 Y& c4 q5 e4 q/ q2 H$ i. t6 A
! S; X4 Y- B! _$ T7 ?; y while (1)4 E. d, S& p8 b% [
: Q$ U. ~- h n1 o
{# X! k) E. Y' K
% ^, k" ?: n) w: A7 B
//讀入圖像; B5 S3 a9 a& p% r) _( U* P
5 o9 }. {4 s) c0 C Mat frame; //定義一個Mat變量,,用于存儲每一幀的圖像,,將該項至于循環(huán)之外,不要重復(fù)定義Mat,,增快速度,;
. ^4 ^- Q8 [0 ~ a* t6 R" S
[ i% z, Q. q& I+ Q6 w if (chufa=1) //當取樣信號為1時,開始取當前幀,,然后進行識別" r4 N6 n; {6 z# @( U/ T
# }. h8 t1 N. o5 H {
+ j( Q! i- A+ o Y* p% s" _# x# `7 h+ k2 @
capture >> frame; //讀取當前幀,,videocapture函數(shù)是不斷讀取外界的視頻,需要一個類來讀取當前幀,,1 H S4 F6 ]* ~6 f1 q
chufa=0;' W! ]/ w u3 C' E% H( e
- t0 N+ z* I/ r w' Y/ n
//對于只需要一副圖片來進行檢測的操作來說,,每個循環(huán)只要出發(fā)某個取樣信號,,取樣一次就好了,。因此用IF語句
! M5 m' a' {$ _; U% F2 {; U- A }; H
cvtColor(frame, edges, CV_BGR2GRAY); //灰度化 --如果說需要使用顏色檢測蒜瓣的底部和頭部,可能還需要顏色來判斷6 J7 E' r9 }5 A/ D
; O9 W6 B( z% F2 n8 s& Q$ J threshold(edges, edges, 120, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //二值化,,將其變成黑白兩色的圖樣
2 K$ {/ Q/ s( X) [$ S0 |6 v: d. W2 J- Z6 {$ `8 q( ?% _
blur(edges, edges, Size(3, 3)); //進行模糊,,使用3*3內(nèi)核來降噪8 M+ L i, u# x1 Q; _0 d
8 j% \- R% _7 c* a7 W Canny(edges, edges, 0, 30, 3); //進行canny邊緣檢測并顯示$ k% a, w$ [( q3 y, t
& h! M7 }0 V3 ] o // findContours (edges, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); //要求原圖像為8位單通道圖像;其中edges是源文件,,contours是輪廓函數(shù),??+ t$ f" o) O$ ^- t" W6 y- o
& O y$ \& A3 `' `4 X
//CV_RETR_EXTERNAL,僅需要外側(cè)的輪廓用于識別,,
+ `( B7 \5 A5 O
q V( Z+ u( y, Z- U- @ //CV_CHAIN_APPROX_NONE,,獲取每個輪廓的每個像素,最好是連續(xù)的,,4 K3 e$ Z- h4 N, K5 H7 r
% k1 z4 [" P X" Z" i
}" O9 x3 p# L0 r1 a" x
9 b, m- A- j( H, d
imshow("蒜瓣輪廓圖", edges); //顯示當前幀4 R1 m/ G. r" r0 z1 P% Q
& {3 U) B& U. D, H
if (waitKey(30) >= 0)
/ o; U% s! L' J, g+ D2 U
+ d' X' `3 P# J; b. y0 W/ }+ F& b% C* ~ break;
4 A3 t" }, ?: d9 U( p
# e! K2 M0 a" j% X+ Q
) m" e' `+ _/ }- V, j8 k5 V& X
3 l( d7 \; u0 J4 A }
$ s8 ^& f" b1 j7 p1 M2 a7 \! \: c' H/ ]5 V. ?
return 0;
4 S+ E/ l* B* l }
1 n6 D) N% |4 V; }} |
|