|
程序如下:) L9 W3 d$ f3 n9 o: D# @; a
. [$ L% b: o/ ?5 j# _
操作系統: win7 64位
# v- M7 z. j1 C7 s4 @' JIDE:VC++2010旗艦版% g4 j o* m5 }8 D+ v
視覺軟件: OPENCV 3.0
/ E4 k) E! ?% A4 A' A7 C& l" Y
" |& X# t' N9 f/ ^) v& Z; u! ~- L" I( ]
//#include "stdafx.h"6 K: x) B0 X0 K6 `( Z+ v
#include "core/core.hpp"7 M% C( Z; d1 @; F2 |7 K
#include <opencv2/imgproc/imgproc.hpp>$ v0 T7 m# f) O+ w4 J3 L% u4 h
#include <opencv2/highgui/highgui.hpp>5 {- q L0 }, O. y2 r7 C) Q4 s9 @9 V
#include <iostream>
$ V, y) Y& N; Z$ r, T% m% v#include "highgui.h"$ i7 ~" B* a3 ?/ r; A) B
#include <set>. p6 _4 n0 A' t( L
#include <opencv2\opencv.hpp>8 g, G6 d9 s% Y+ t- R# ~5 ^5 x: W, g
#include<vector> //包含所需要的類文件vector,還有一定要加上using namespace std。
# e C# J8 V! v% M8 ^5 H1 E) r#include <stdio.h>
C4 q+ {9 x2 z#include <conio.h>- h& P3 M6 t5 O+ \/ Q9 ^
#include <opencv2/highgui/highgui_c.h>, }& l/ Q/ a8 G' @( G4 i8 K: D. F
#include <math.h>1 w5 I) K) ^2 H) \& X" P5 P0 K
#include "iostream"
$ z6 b% W$ a7 w+ x$ a#include "cv.h": q/ q w9 v$ X9 V! J% N
#include "highgui.h"6 R7 |" p' Z4 ]% z
using namespace std;
* S( N# A; f" g. ausing namespace cv;0 B8 B! W$ V& _; p( J
9 G5 m$ P) b; e7 m
" F% {% h( G- u& e5 V$ t
0 f& v9 x; D" b; ?5 S//-----------------------------------【main( )函數】--------------------------------------------
' N* _7 C" X* @; y8 R3 j// 描述:控制臺應用程序的入口函數,我們的程序從這里開始' J- }6 ]2 W# [8 p4 o7 w
//-------------------------------------------------------------------------------------------------0 P7 f+ y& }1 g7 B
3 O t) T( e' ]! H) `
int main()
2 M4 h- M! Q8 j) ?2 y9 E+ \% Q0 L% N" z9 w
{
( q- @' {3 m4 e8 E4 }& j2 Dint chufa=1;
e, W! e+ k) {% t9 M, J2 F- \ //【1】從攝像頭讀入視頻
! J& ]) T& r ?
! D' d1 }0 ^5 A; R5 T4 O. R( | VideoCapture capture(0);
' t. U$ u; {8 n& }; c0 }' D' ~8 G/ {
Mat edges; //定義類
' l# F* H; n( \; ?, Y% ]2 i7 f+ y v: {
namedWindow("預處理后的視頻", 0); f$ C0 ^0 K) X& a( O8 ?" c3 E u
. [7 `! e3 k' ~- J- x4 G6 f9 C
// Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,將該項至于循環之外,不要重復定義Mat,增快速度;
8 c3 X2 D* K* \7 ~- I) Z6 R: R) q+ ?% e$ O* U
//定義輪廓和層次結構(這個不是很理解)7 r1 O7 |# K4 z9 H* I2 \. I
# t @/ C, }: @3 g1 u- G
//vector<vector<Point>>contours; //其中contours 應該是一個變量,可以用在后面的輪廓查找的函數中,定義點的向量( ]' v `. \" t
. d, I1 m* k3 n+ j& _ ~6 |
//vector<Vec4i>hierarchy; //定義四維向量???. S4 E. \( b& z3 S
0 x3 {/ h1 t1 X* Z
//【2】循環顯示每一幀# q6 Z7 g4 O" |! r5 P! }
1 w' W" _ W7 s: W% ]6 ?7 o |
while (1)
5 ]+ q! [: P. z. k1 C. r, N u8 u4 r3 y
{
2 o) d( J. }. ~* w/ t9 e
* n% M4 h( Y& c% N( `! M; H( ` //讀入圖像
5 [, H. y+ l, `) | j0 \% v- {6 P0 Z' o7 r
Mat frame; //定義一個Mat變量,用于存儲每一幀的圖像,將該項至于循環之外,不要重復定義Mat,增快速度;
' m1 f* Q: x0 Y2 G6 ?: e% e$ D) m" S8 J' Z. p
if (chufa=1) //當取樣信號為1時,開始取當前幀,然后進行識別
; J }/ ^0 J: c2 t% l0 m) V$ v
" R# B; Z8 x$ ` {
4 p* {. K8 j/ i1 F' R. A% e9 S- a0 K2 c: @. Y8 N
capture >> frame; //讀取當前幀,videocapture函數是不斷讀取外界的視頻,需要一個類來讀取當前幀,
# d( r8 b5 z+ { chufa=0;3 _, |' }; J) c1 h
2 t6 d8 {0 _4 J( a //對于只需要一副圖片來進行檢測的操作來說,每個循環只要出發某個取樣信號,取樣一次就好了。因此用IF語句' y" l2 M1 k$ o! K. b( Q z
5 X$ @* N9 i& f {4 Z
cvtColor(frame, edges, CV_BGR2GRAY); //灰度化 --如果說需要使用顏色檢測蒜瓣的底部和頭部,可能還需要顏色來判斷8 }; o1 N) |/ X7 L
7 b6 [3 u; t6 H( p
threshold(edges, edges, 120, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //二值化,將其變成黑白兩色的圖樣' D% g- |3 G, H* u
' U, o& C! _9 d blur(edges, edges, Size(3, 3)); //進行模糊,使用3*3內核來降噪5 \, h9 _* d* `3 s1 j" n0 p" D0 D4 N
5 u) t. H1 p( M4 v/ V% g Canny(edges, edges, 0, 30, 3); //進行canny邊緣檢測并顯示+ K5 ?+ M0 b; f- k# Y. \
0 O) s5 p; W2 m. a$ b // findContours (edges, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); //要求原圖像為8位單通道圖像;其中edges是源文件,contours是輪廓函數??) n& B0 }% e: O
2 @# e- V; l8 W; z# _
//CV_RETR_EXTERNAL,僅需要外側的輪廓用于識別,4 V* V; w2 w6 M4 k
" E" G& G$ L/ B //CV_CHAIN_APPROX_NONE,獲取每個輪廓的每個像素,最好是連續的,
- ?, v O' C* E" F7 T8 l! s- U& ?8 T( a7 ]7 \& p
}% t8 U, W1 r4 F/ s3 L- o
) B$ A. {# g, ^ imshow("蒜瓣輪廓圖", edges); //顯示當前幀% P& `0 t8 d5 N+ i- b+ w
K) r* e2 C/ x if (waitKey(30) >= 0)
5 E1 E; D7 N# j3 b9 | T" M6 ~/ O
7 K+ l& y# D: {5 H4 ~ break;
9 B) E: V6 M4 V3 H1 S; w) m U! s! b" |+ {
/ x# U3 x2 ], p- G' f( l* A, E
7 J9 a w2 r0 |7 F- f( n* O L) i' G* g }+ e O- `) q. T" ?1 ~$ h: C1 ]3 m
! `, S/ \6 t" E \! `9 B. M
return 0;
, y" ^" }( |7 t
6 m& k. N! z& G} |
|