|
程序如下:$ ?% \: ?# k. |" x9 [
8 g; F a$ Q8 y/ K
操作系統: win7 64位
$ v6 b( F0 B KIDE:VC++2010旗艦版
- o; C. i b) `5 ~: R* i7 ]8 r視覺軟件: OPENCV 3.0+ S& @3 |& u7 b, T$ a2 n
& [8 \9 t, l: n" p
3 q2 R: f4 N+ w4 g. K4 P9 K
//#include "stdafx.h"" b( o$ E3 ~3 [! A1 T1 y3 r. H
#include "core/core.hpp"
3 R7 r2 A6 T1 j#include <opencv2/imgproc/imgproc.hpp>; U1 p- F9 p# p; Z
#include <opencv2/highgui/highgui.hpp>: n8 D& A w" m9 b$ @
#include <iostream>
: a+ r5 n9 ]+ j, i7 g#include "highgui.h", k+ }2 y# O! Y
#include <set>
% v/ v W9 [5 h5 N$ i- |#include <opencv2\opencv.hpp>
! l8 m1 m7 S9 N H* G7 v5 |#include<vector> //包含所需要的類文件vector,還有一定要加上using namespace std。; r# [& @( \! V. f
#include <stdio.h>1 ]+ p$ L- Z' K+ {* m$ ~5 J$ y
#include <conio.h>! h3 C4 w/ N1 }+ n1 q5 V: A5 P
#include <opencv2/highgui/highgui_c.h>
; |; C+ f% o3 [0 E3 F; A' p1 `#include <math.h>3 f& @' j0 R( \) O
#include "iostream"
* I+ D6 P6 C3 i, R5 t& G#include "cv.h": U" F- S0 @: ?* C H( f
#include "highgui.h"
3 W* o# `; k( ?% o. |3 g( f- Busing namespace std;
! v) z1 q/ w$ W4 ?1 I6 Eusing namespace cv;
D* v& P6 d, u w4 I$ X3 d8 U; q# G4 v1 W) h5 t* q
. r1 e, v! {+ Z2 n% I6 k* F( }/ H2 w' Q. S( n
//-----------------------------------【main( )函數】-------------------------------------------- v1 O* Z# l# p
// 描述:控制臺應用程序的入口函數,我們的程序從這里開始
' q$ s @( I7 D2 O* m1 z* g//-------------------------------------------------------------------------------------------------" T& \# w) v. t, Z( V4 j1 d0 L0 Q
& f$ r; O& X$ zint main()) {3 _* ?" i9 U
: @4 M0 R8 w/ c8 u& V, N( K- ?- {5 _{
! o( \. L" H3 C8 h5 Qint chufa=1;) g' P7 E9 ]* }, y$ L( m! P+ x
//【1】從攝像頭讀入視頻) D: L8 C/ w& z; d+ l5 j. x
& r' x' D! k" N# u4 i VideoCapture capture(0);
2 K% `8 }, G! X' `4 J t5 p6 E
, S( E$ d0 f/ r P# Y% p B- @ Mat edges; //定義類
# k( g0 E5 O1 Z8 m R. |! e5 j
: y7 @- Q! g4 W9 d) U7 t, ]6 WnamedWindow("預處理后的視頻", 0);! C7 K7 R) Y$ B" H
- r4 a9 U% s6 y" a. u
// Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,將該項至于循環之外,不要重復定義Mat,增快速度;
0 G: P4 f, L! ` Q4 K: s6 V' a1 W& [$ e
//定義輪廓和層次結構(這個不是很理解)2 X) G; D& @* c3 J' X9 [* [- g2 m
& w/ w1 j1 r f! W
//vector<vector<Point>>contours; //其中contours 應該是一個變量,可以用在后面的輪廓查找的函數中,定義點的向量
- A/ w2 T( B, \; K0 }# Z* `
4 u9 p# D0 q. _8 y//vector<Vec4i>hierarchy; //定義四維向量???1 L& h* u- A. G# U
# M' b) q$ P A
//【2】循環顯示每一幀
, K" U$ c( N) q# C+ j3 A" X- J( e' V% J! K
while (1)
7 B3 R( G7 ~2 r8 B C: H# t$ |& l8 ]# H0 |0 ?0 v5 v
{
" a1 D0 K. L9 g+ B/ X
" O2 p7 W7 @! O% p5 E; n+ X6 j //讀入圖像+ u1 ?" R3 D1 X! A/ H; y
3 n! `0 `7 |' @
Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,將該項至于循環之外,不要重復定義Mat,增快速度;2 d: k9 v8 K, n$ U N" l$ g4 y
# e/ q k1 i+ t1 u! o7 u8 L, F
if (chufa=1) //當取樣信號為1時,開始取當前幀,然后進行識別- r {# M1 E& N& D
1 ?, {/ A. v0 m3 Z+ \5 k% Q {0 j+ h/ z. P* M; R6 u
( N2 d* i5 f) n3 A: i2 d" b
capture >> frame; //讀取當前幀,videocapture函數是不斷讀取外界的視頻,需要一個類來讀取當前幀,5 y6 [& W- e$ M0 S, l+ u
chufa=0;8 d- a+ ]: a1 ]: h
% I4 S) ~$ U& ?$ k; C& ^4 n o3 p
//對于只需要一副圖片來進行檢測的操作來說,每個循環只要出發某個取樣信號,取樣一次就好了。因此用IF語句
) Y( h0 i$ Y. W
5 d* U2 Y1 Y: H- G" T cvtColor(frame, edges, CV_BGR2GRAY); //灰度化 --如果說需要使用顏色檢測蒜瓣的底部和頭部,可能還需要顏色來判斷# x5 Z s: G: V+ n$ V( `1 O
5 p( {" {: k. H/ Y- x2 x% e
threshold(edges, edges, 120, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //二值化,將其變成黑白兩色的圖樣
. h' p- c; w+ A
+ A8 s# c* m. V' p4 R& c2 o5 x blur(edges, edges, Size(3, 3)); //進行模糊,使用3*3內核來降噪3 R; n& B0 O' m
+ h( e R: P* j8 y Canny(edges, edges, 0, 30, 3); //進行canny邊緣檢測并顯示
2 R, a/ N5 \( Y% a5 Q5 m+ n, v2 r9 k
// findContours (edges, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); //要求原圖像為8位單通道圖像;其中edges是源文件,contours是輪廓函數??
) q! R. z4 ]# ~, B0 c7 F1 e
, w. C+ `5 y/ w2 i9 h //CV_RETR_EXTERNAL,僅需要外側的輪廓用于識別,
8 B! _# k- i. z* Q! [* i) D$ `% v
; R% i: O @& w6 d1 `5 g1 ]% W //CV_CHAIN_APPROX_NONE,獲取每個輪廓的每個像素,最好是連續的,) ?3 y+ e4 G( Z% ?
, @$ A# ?" I' m0 @- }
}
( \' ?$ N( h$ ]* n8 \, V( r5 A5 i. \4 @7 k3 h& T( N" |3 v
imshow("蒜瓣輪廓圖", edges); //顯示當前幀
) v% M! z6 ^& o$ e) n+ Z
" a! k. O) ~3 \1 ?) H2 K if (waitKey(30) >= 0)$ }& p9 `& d$ V/ ?" K/ F
+ ^0 G0 @. \! K* ]/ D7 [% P break;' D8 o) G( n7 @' V; W
I) t4 F( F9 ]7 ]! q; n( F/ S
! s! W# d L1 C1 R, J
, P, n% G+ S$ a9 z: ], H7 c }
$ X- {% t# u' T" ~& ]9 j
) M6 c5 w+ q# W return 0;
0 [) m* d/ A( F! I) L: B& m7 T1 C C3 G8 r: i* \
} |
|