opencv學習(四)輪廓識別

2021-06-28 04:53:10 字數 2629 閱讀 8451

本章學習輪廓識別

// bbb.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include using namespace std;

using namespace cv;

int _tmain()

size refs = size( (int) captrefrnc.get(cv_cap_prop_frame_width),

(int) captrefrnc.get(cv_cap_prop_frame_height) );

bool bhandflag = false;

const char* win_src = "source";

const char* win_result = "result";

// windows

namedwindow(win_src, cv_window_autosize );

namedwindow(win_result, cv_window_autosize);

mat framehsv; // hsv空間

mat mask(frame.rows, frame.cols, cv_8uc1); // 2值掩膜

mat dst(frame); // 輸出影象

// mat framesplit[4];

vector< vector> contours; // 輪廓

vector< vector> filtercontours; // 篩選後的輪廓

vector< vec4i > hierarchy; // 輪廓的結構資訊

vector< point > hull; // 凸包絡的點集

while(true) //show the image captured in the window and repeat

imshow( win_src, frame);

// begin

// 中值濾波,去除椒鹽雜訊

medianblur(frame, frame, 5);

// gaussianblur( frame, framehsv, size(9, 9), 2, 2 );

// imshow("blur2", framehsv);

// pyrmeanshiftfiltering(frame, framehsv, 10, 10);

// imshow(win_blur, framehsv);

// 轉換到hsv顏色空間,更容易處理

cvtcolor( frame, framehsv, cv_bgr2hsv );

// split(framehsv, framesplit);

// imshow(win_h, framesplit[0]);

// imshow(win_s, framesplit[1]);

// imshow(win_v, framesplit[2]);

mat dsttemp1(frame.rows, frame.cols, cv_8uc1);

mat dsttemp2(frame.rows, frame.cols, cv_8uc1);

// 對hsv空間進行量化,得到2值影象,亮的部分為手的形狀

inrange(framehsv, scalar(0,30,30), scalar(40,170,256), dsttemp1);

inrange(framehsv, scalar(156,30,30), scalar(180,170,256), dsttemp2);

bitwise_or(dsttemp1, dsttemp2, mask);

// inrange(framehsv, scalar(0,30,30), scalar(180,170,256), dst);

// 形態學操作,去除雜訊,並使手的邊界更加清晰

mat element = getstructuringelement(morph_rect, size(3,3));

erode(mask, mask, element);

morphologyex(mask, mask, morph_open, element);

dilate(mask, mask, element);

morphologyex(mask, mask, morph_close, element);

frame.copyto(dst, mask);

contours.clear();

hierarchy.clear();

filtercontours.clear();

// 得到手的輪廓

// 去除偽輪廓

for (size_t i = 0; i < contours.size(); i++)

}// 畫輪廓

drawcontours(dst, filtercontours, -1, scalar(0,0,255), 3/*, 8, hierarchy*/);

// 得到輪廓的凸包絡

for (size_t j=0; j

執行效果如下圖所示:

opencv學習 9 輪廓提取

輪廓提取 主要針對二值影象 1 輪廓分為外輪廓和內輪廓 如下圖 外輪廓以c開頭 內輪廓以h開頭 其中img是二值影象,storage是記憶體儲存序列,contours指向儲存的第乙個輪廓,cvmemstorage storage cvcreatememstorage 0 記憶體儲存序列 cvseq ...

opencv學習筆記(15)輪廓發現

參考 python opencv2利用cv2.findcontours 函式來查詢檢測物體的輪廓 試驗用圖 效果 tips 1.如果二值化之後的影象的底色是白色,那麼最後的繪圖會把整張框進去,如圖所示 第三章的邊框是綠色的 這行 因opencv版本而異,opencv2.x和4.x只需要寫成 而ope...

opencv 9 輪廓 性質

邊界矩形的寬高比 x,y,w,h cv2.boundingrect cnt aspect ratio float w h輪廓面積與邊界矩形面積的比 area cv2.contourarea cnt x,y,w,h cv2.boundingrect cnt rect area w h extent f...