|
程序如下:$ h6 h5 a' b6 ^
" R9 C5 G: @5 m E
操作系統(tǒng): win7 64位
( U( W# R3 E T. e3 ~IDE:VC++2010旗艦版& c! \1 r+ ]3 r! Q9 D% W6 r9 D
視覺軟件: OPENCV 3.08 I4 N: i& k0 }, g
1 x" u% I( `5 f
. I1 h3 o- \, h//#include "stdafx.h"
+ r" S& f& G$ A, {1 m. G! ~#include "core/core.hpp"
2 Y, p# F& [8 c+ L) ~- L Y. p#include <opencv2/imgproc/imgproc.hpp>
; v# ]5 n2 ~5 k. x#include <opencv2/highgui/highgui.hpp>, O. N( f1 p9 A! Z
#include <iostream>
: e% B0 y1 }: Q#include "highgui.h"1 o+ l* z& P) ]: D m# X3 Y. S3 D
#include <set>
2 T6 l! W3 s; y1 b2 P9 x: O+ D#include <opencv2\opencv.hpp> k" U0 ?* i* @5 {9 o8 d0 T
#include<vector> //包含所需要的類文件vector,還有一定要加上using namespace std。# x% ]" n0 n6 D0 {: n6 U* i+ S
#include <stdio.h>
/ t& r( H! Y$ ]1 n#include <conio.h>% A/ K5 ?% E0 H8 A7 Q
#include <opencv2/highgui/highgui_c.h>
" [! _3 D4 Y; x. c! x! N3 D* Y% m#include <math.h>
9 b% u3 S5 Z% z6 ^. k1 T. e' F#include "iostream"
7 U% l6 R" y2 \. [8 C#include "cv.h": d7 L. N# W0 x3 C2 D
#include "highgui.h"2 T. A8 u ~6 \ ^* M/ t
using namespace std;' q) z7 G6 C/ U2 a/ z; ]
using namespace cv;, \: s+ f0 L; H& j: O5 D; w- t7 ?; Y
0 U7 F3 h" w* h) E/ W' J
0 C) N8 `, q* C/ P1 Y' G9 A
( d: Z4 ?# a4 L9 ^/ k//-----------------------------------【main( )函數(shù)】--------------------------------------------* C2 k$ ~: }4 S; q7 f* i
// 描述:控制臺應用程序的入口函數(shù),我們的程序從這里開始4 y G0 C/ u9 q) ~+ \
//-------------------------------------------------------------------------------------------------
; B% k4 r8 }7 B, |. _" V9 f. f c% F8 x4 B
int main()6 T8 l$ w% E* g5 F. Y% u+ T, `
7 E4 g' b% M( {8 _{( r, M* q- V9 n( }5 g
int chufa=1;
3 }3 s, D6 W1 x* H$ a) j0 O //【1】從攝像頭讀入視頻: Z$ X: O6 E2 M) E1 O! R
+ \) l a) K, W8 }7 {+ O VideoCapture capture(0);' y/ T: [% a. n- J
0 e. B* ^/ r9 Y3 x5 G2 O Mat edges; //定義類
" x. g0 q$ s* d
: v6 C% |5 l1 dnamedWindow("預處理后的視頻", 0);5 l8 ^6 y% G4 s. T8 T
! `' c7 O4 l6 _: K3 Z" a0 g3 J
// Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,將該項至于循環(huán)之外,不要重復定義Mat,增快速度;
; v/ I4 t5 M5 r; o# M# g' h9 Y7 F
6 B8 `# b9 `' i8 R8 D. @' [8 m//定義輪廓和層次結構(這個不是很理解)! ~7 h% M( Q) _. [; Y
+ W% f. ]2 G6 p+ f0 p' | @
//vector<vector<Point>>contours; //其中contours 應該是一個變量,可以用在后面的輪廓查找的函數(shù)中,定義點的向量2 s, Q+ ]) `+ u3 m
) c' V: A. N+ K/ \' b) W' @2 W r//vector<Vec4i>hierarchy; //定義四維向量???4 w, y/ b. y9 b6 O m3 m: M. s! }
7 Y; z9 A6 x; c3 Y, {4 ? s% W
//【2】循環(huán)顯示每一幀
# h& I% T' K0 e8 ~! j' r1 y/ B: c
! m2 T& R1 L1 n6 [4 |; D# P while (1)3 @( V3 v8 ?3 x
% U: \/ D3 m+ K2 N1 O' r' Q {
9 O) A! u' L7 y# S Q' \* o9 i2 k" I5 c$ L& f! r2 U
//讀入圖像
; @7 } ~% d- g! X! H6 ~$ M( f0 ^& ^: W4 ]. [
Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,將該項至于循環(huán)之外,不要重復定義Mat,增快速度;
4 h# l, B% y' c, g- v' t
0 _5 H4 z% l- u8 q1 Z0 o5 U if (chufa=1) //當取樣信號為1時,開始取當前幀,然后進行識別+ ?) D& w* [7 G N' p
: {: T: n9 x# n
{. ^' N1 `, V" ^& H
! i# l& z' o" Q) U! Q3 G capture >> frame; //讀取當前幀,videocapture函數(shù)是不斷讀取外界的視頻,需要一個類來讀取當前幀,
- I w9 N* N( ^0 r% G/ X- F chufa=0;
# u" Z7 c) |0 ?! i+ t' r a7 [& c+ [3 k$ X1 ~( p6 ~
//對于只需要一副圖片來進行檢測的操作來說,每個循環(huán)只要出發(fā)某個取樣信號,取樣一次就好了。因此用IF語句
/ e# ?# I; v6 ]8 Z( h5 ]! _/ ]" U) Z7 _0 b% z6 W6 i$ E+ V8 c5 o
cvtColor(frame, edges, CV_BGR2GRAY); //灰度化 --如果說需要使用顏色檢測蒜瓣的底部和頭部,可能還需要顏色來判斷
, R& G) z8 P A3 c. h. m) h
! f. h5 N/ P9 a- F1 e, } threshold(edges, edges, 120, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //二值化,將其變成黑白兩色的圖樣
: ~2 F5 Z4 T1 J% a( n h& e [3 [( b5 w& k# R/ k
blur(edges, edges, Size(3, 3)); //進行模糊,使用3*3內(nèi)核來降噪1 V" N8 F1 C. L9 [4 y$ u
; d9 {& P9 X! l
Canny(edges, edges, 0, 30, 3); //進行canny邊緣檢測并顯示1 H" {8 p7 _9 t1 p0 \2 A
+ ~2 [ h) O' Z/ k' }
// findContours (edges, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); //要求原圖像為8位單通道圖像;其中edges是源文件,contours是輪廓函數(shù)??
: E4 R+ v" v J5 U6 n5 E
( Y6 I4 w* } Y1 |( P5 v //CV_RETR_EXTERNAL,僅需要外側的輪廓用于識別,
- |# I3 I+ k' D; R4 N$ u2 }0 c* Q- h5 v1 g" a
//CV_CHAIN_APPROX_NONE,獲取每個輪廓的每個像素,最好是連續(xù)的,1 ] `5 J* v' C% W* Z
4 V/ [. Q3 f/ A
}+ G% J8 b1 o! @: v3 ` k) n4 x! y
* W: ]. ^" I7 V# E$ f
imshow("蒜瓣輪廓圖", edges); //顯示當前幀- |2 V8 s+ o& U& t! L1 z b
1 u7 ^, u2 l' U# A4 O" O if (waitKey(30) >= 0)$ s# @" q7 v! R7 Y: V( J: X( z
/ J- U, J" M' R* Y
break;
+ p3 X$ U1 m/ Y7 E. s3 S8 {& I4 p
7 [0 m8 f( ^& V& Q0 V ! i7 c* C* K- Y1 X4 V8 f" P: y9 B
* ]7 @. ^: D* @+ v: g6 u }6 J: M, u6 W5 x/ f2 ^9 n
& c# J# I& H% b' X/ T% W return 0;
' W) |1 f" M1 I$ T k( {
* F$ u- g6 ^# ~& o% Q& v, x& ]1 {8 S} |
|