|
程序如下:
$ W' V6 U3 c: i# z/ f
+ {3 F9 T) S# W' c7 L& }" ]操作系統: win7 64位# k! n- K; ~; s. u8 K, ~" b+ e
IDE:VC++2010旗艦版
: o3 R- N" A1 d, Q視覺軟件: OPENCV 3.0
/ r% w: F/ ~( N# P+ [+ ?0 H
* ? z h' |5 d& ]0 [. x9 e$ A* w
//#include "stdafx.h"% X, c- F7 P. f; N
#include "core/core.hpp"
7 V/ C( |0 \7 K3 |$ B( ?- S#include <opencv2/imgproc/imgproc.hpp>
9 V- H+ j }5 z& Y" L G#include <opencv2/highgui/highgui.hpp>! ]3 Y6 B/ h) e6 w8 C
#include <iostream>' C+ \: c. R# [. k \
#include "highgui.h"" t/ R9 b/ o! u C8 M
#include <set>
- b1 n& H$ B6 d+ R/ {0 b$ h8 C. G#include <opencv2\opencv.hpp>: T) Q) Z. ?* N' L# @ }# X7 ^
#include<vector> //包含所需要的類文件vector,還有一定要加上using namespace std。; S% E b' k/ Q, x
#include <stdio.h>
7 E" z( ?3 S7 ^$ }, d0 v9 P#include <conio.h># y4 O9 e) a ~
#include <opencv2/highgui/highgui_c.h> w. }- J: f: j
#include <math.h>4 c3 y0 |% j) h
#include "iostream"9 D4 B3 r6 X4 g( S
#include "cv.h"+ M8 d1 I# V7 e; I* [0 |3 c# v
#include "highgui.h"8 H S2 |& u8 h( q! s+ K5 }
using namespace std;# K& |9 Q% H' X2 O: ?
using namespace cv;
, b M7 X1 ?0 G5 k) c
4 o) r/ f+ i# O# p0 |
. |7 C& z. ~, U/ v6 O* K
# d/ ~+ O* |: v, `3 }//-----------------------------------【main( )函數】--------------------------------------------# S1 g' w3 L* ~) \$ c
// 描述:控制臺應用程序的入口函數,我們的程序從這里開始' l7 V; e9 r3 G0 X) _; O
//-------------------------------------------------------------------------------------------------
2 }$ \, _2 t w7 g2 d; {
: I- s7 @. w3 |, iint main()# K6 g4 p% ]1 P* D& R
0 n8 ` O6 t7 P* C9 Z- c& j{" n5 {% t. N9 }9 B+ N
int chufa=1;- D% U4 o+ o ^! {! L+ t
//【1】從攝像頭讀入視頻; |5 u1 E9 v, j' c" |
2 X, T- n3 G4 C T" R: e8 Q VideoCapture capture(0);! W% f9 t6 }6 Y& d" k
% x) h7 k5 ~0 n Mat edges; //定義類. `9 c( C/ H- S; \8 I3 `! ~7 V3 P& v/ y5 _
$ g, c$ n/ S* K: c2 J5 g0 T% A5 p
namedWindow("預處理后的視頻", 0);" h! n3 x- [7 r; t: I% V
; e4 ~* H- \ d // Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,將該項至于循環之外,不要重復定義Mat,增快速度;
5 l& u" {- X7 n4 _- ^1 _7 _: `5 y- b1 F: K
//定義輪廓和層次結構(這個不是很理解)
% z/ j1 t( V9 X0 A- Z9 J) f9 e$ C7 L: h' `. i
//vector<vector<Point>>contours; //其中contours 應該是一個變量,可以用在后面的輪廓查找的函數中,定義點的向量
% B! Y. O1 `- Z6 z* a- D2 M, k: L0 D: V3 d% f. O) q+ C/ a
//vector<Vec4i>hierarchy; //定義四維向量???
% l; M7 m5 _$ G6 ?) J9 G m& v+ O
//【2】循環顯示每一幀" Q# s& P- ^6 `7 j. A0 U( T
/ w9 a/ ~7 x5 b0 A& | while (1)
* g' n" z( l/ Z+ [+ X$ a) f' E9 U) P4 s6 Q
{% p. k: d$ y! s3 u# u- |
) C3 q& j1 W0 h% a //讀入圖像+ A4 B# m) s; k% g% n4 [
\2 J4 l2 d8 d* M9 a3 S Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,將該項至于循環之外,不要重復定義Mat,增快速度;
8 p3 B0 g i+ M7 C3 ]2 b, y0 T) p& }3 f) I" a. I6 p
if (chufa=1) //當取樣信號為1時,開始取當前幀,然后進行識別: c+ U- S/ m) ~3 K
9 r" Y2 q. A& T6 s* W
{
1 z0 V4 n! i0 P s) z+ H9 `2 J: A- s' d
capture >> frame; //讀取當前幀,videocapture函數是不斷讀取外界的視頻,需要一個類來讀取當前幀,
9 R9 |* b; a7 D# J* @2 V chufa=0;
1 @& q; k! E& i; U7 c" ? P; H# T3 |$ T& w; m: N( |
//對于只需要一副圖片來進行檢測的操作來說,每個循環只要出發某個取樣信號,取樣一次就好了。因此用IF語句! K' A8 m, d0 x, V4 R a
8 \! I$ Z, [+ {( D# e U5 p cvtColor(frame, edges, CV_BGR2GRAY); //灰度化 --如果說需要使用顏色檢測蒜瓣的底部和頭部,可能還需要顏色來判斷) O' E3 C% ]9 A, Y8 J( i- j3 z% b
, S, b4 T% e7 y: A threshold(edges, edges, 120, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //二值化,將其變成黑白兩色的圖樣
2 i; u2 E* f, c- ?6 K8 b8 e7 j) x3 \" O, U" K3 Q0 D
blur(edges, edges, Size(3, 3)); //進行模糊,使用3*3內核來降噪/ W% x$ J8 q% l- N0 y' F' n& q
8 U o$ Y& ?4 q }* {
Canny(edges, edges, 0, 30, 3); //進行canny邊緣檢測并顯示
7 c( i$ A, a% P: K% L w* d, O" I0 `
// findContours (edges, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); //要求原圖像為8位單通道圖像;其中edges是源文件,contours是輪廓函數??
0 ^6 ]. x9 s* s- D% V" n0 v3 w+ \! Q1 z1 f# q7 j8 U3 K
//CV_RETR_EXTERNAL,僅需要外側的輪廓用于識別,
+ g7 W; ^5 m; L! j
& S: A: H+ v+ {+ e8 Q2 \ //CV_CHAIN_APPROX_NONE,獲取每個輪廓的每個像素,最好是連續的, s4 n( a& s- E+ T
+ K) t* L& x! S8 e% R9 Q) e
}, o+ I2 v, h: ~8 O/ r4 x
+ E. r: ?+ i6 n# `: u
imshow("蒜瓣輪廓圖", edges); //顯示當前幀( D! y2 F& I/ {. m/ k6 |
0 _0 S, x/ L1 i F8 A
if (waitKey(30) >= 0)- u% v/ |; @& v& D
: @$ H0 B, c7 p# n, ^* B break;# C$ v. E8 \8 v3 t% }7 D
, _$ P2 P' w3 H( O% s V& t0 D* U
% z; N+ {) [ i6 g4 S
* l% R0 `% ^( p i* j1 u) i' Z }( \- x' m' E3 i* Z3 w9 M+ v
: N3 F3 p0 h' J3 u# K/ D/ Z8 {4 C
return 0;5 O3 C6 I" c" T
5 ?8 M% J* k: w6 w) X
} |
|