亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言實現opencv提取直線、輪廓及ROI實例詳解

2020-01-26 13:49:33
字體:
來源:轉載
供稿:網友

一、Canny檢測輪廓

在上一篇文章中有提到sobel邊緣檢測,并重寫了soble的C++代碼讓其與matlab中算法效果一致,而soble邊緣檢測是基于單一閾值的,我們不能兼顧到低閾值的豐富邊緣和高閾值時的邊緣缺失這兩個問題。而canny算子則很好的彌補了這一不足,從目前看來,canny邊緣檢測在做圖像輪廓提取方面是最優秀的邊緣檢測算法。

canny邊緣檢測采用雙閾值值法,高閾值用來檢測圖像中重要的、顯著的線條、輪廓等,而低閾值用來保證不丟失細節部分,低閾值檢測出來的邊緣更豐富,但是很多邊緣并不是我們關心的。最后采用一種查找算法,將低閾值中與高閾值的邊緣有重疊的線條保留,其他的線條都刪除。

本篇文章中不對canny的算法原理作進一步說明,稍后會在圖像處理算法相關的文章中詳細介紹。

下面我們用OpenCV中的Canny函數來檢測圖像邊緣

int main() {   Mat I=imread("../cat.png");   cvtColor(I,I,CV_BGR2GRAY);                            Mat contours;   Canny(I,contours,125,350);   threshold(contours,contours,128,255,THRESH_BINARY);   namedWindow("Canny");   imshow("Canny",contours);   waitKey();   return 0; } 

顯示效果如下:

二、直線檢測

用到的是霍夫變換檢測直線的算法

直線在圖像中出現的頻率非常之高,而直線作為圖像的特征對于基本內容的圖像分析有著很重要的作用,本文通過OpenCV中的hough變換來檢測圖像中的線條。

我們先看最基本的Hough變換函數HoughLines,它的原型如下:

void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 );

它的輸入是一個二值的輪廓圖像,往往是邊緣檢測得到的結果圖像;它的輸出是一個包含多個Vec2f點的數組,數組中的每個元素是一個二元浮點數據對<rou,theta>,rou代表直線離坐標原點的距離,theta代表角度。第3和第4個參數代表步長,因為Hough變換實際上是一個窮舉的算法,rho表示距離的步長,theta代表角度的步長。第5個參數是一個閾值設置直接的最低投票個數,知道Hough原理的,這個參數應該很容易理解。

從這個函數的輸出結果我們可以看出,得到的直線并沒有指定在圖像中的開始點與結束點,需要我們自己去計算,如果我們想把直接顯示在圖像中就會比較麻煩,而且會有很多角度接近的直線,其實它們是重復的,為了解決上面這些問題,OpenCV又提供了一個函數HoughLinesP()。它的輸出是一個Vector of Vec4i。Vector每一個元素代表一條直線,是由一個4元浮點數組構成,前兩個點一組,后兩個點一組,代表了在圖像中直線的起始和結束點。

void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta,int threshold, double minLineLength=0, double maxLineGap=0 );

解釋一下最后兩個參數,minLineLength指定了檢測直線中的最小寬度,如果低于最小寬度則舍棄掉,maxLineGap指定通過同一點的直線,如果距離小于maxLineGap就會進行合并。

下面是一個用HoughLinesP檢測直線的例子:

int main() {   Mat image=imread("../car.png");   Mat I;   cvtColor(image,I,CV_BGR2GRAY);                  Mat contours;   Canny(I,contours,125,350);   threshold(contours,contours,128,255,THRESH_BINARY);   vector<Vec4i> lines;   // 檢測直線,最小投票為90,線條不短于50,間隙不小于10   HoughLinesP(contours,lines,1,CV_PI/180,80,50,10);   drawDetectLines(image,lines,Scalar(0,255,0));   namedWindow("Lines");   imshow("Lines",image);   waitKey();   return 0; } 

上面程序將檢測到的線條保存在lines變量內,我們需要進一步將它們畫在圖像上:

void drawDetectLines(Mat& image,const vector<Vec4i>& lines,Scalar & color) {   // 將檢測到的直線在圖上畫出來   vector<Vec4i>::const_iterator it=lines.begin();   while(it!=lines.end())   {     Point pt1((*it)[0],(*it)[1]);     Point pt2((*it)[2],(*it)[3]);     line(image,pt1,pt2,color,2); // 線條寬度設置為2     ++it;   } } 

實際上Hough變換可以檢測很多固定的形狀,比如:圓、正方形等。它們的原理基本相同,都是構造一個投票矩陣。OpenCV里提供了檢測圓的函數HoughCircles,它的輸出是一個Vector of Vec3i,Vector的每個元素包含了3個浮點數,前2個是圓的中心坐標,最后一個是半徑。

三、輪廓的提取與描述

在目標識別中我們首先要把感興趣的目標提取出來,而一般常見的步驟都是通過顏色或紋理提取出目標的前景圖(一幅黑白圖像,目標以白色顯示在圖像中),接下來我們要對前景圖進行分析進一步地把目標提取出來,而這里常常用到的就是提取目標的輪廓。

OpenCV里提取目標輪廓的函數是findContours,它的輸入圖像是一幅二值圖像,輸出的是每一個連通區域的輪廓點的集合:vector<vector<Point>>。外層vector的size代表了圖像中輪廓的個數,里面vector的size代表了輪廓上點的個數。下面我們通過實例來看函數的用法。

int main()  {    using namespace cv;           Mat image=imread("../shape.png");    cvtColor(image,image,CV_BGR2GRAY);    vector<vector<Point>> contours;    // find    findContours(image,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);   // draw    Mat result(image.size(),CV_8U,Scalar(0));    drawContours(result,contours,-1,Scalar(255),2);           namedWindow("contours");    imshow("contours",result);    waitKey();    return 0; } 

上面程序中包含了2個函數,第一個是查找輪廓函數,它的第三個參數說明查找輪廓的類型,這里我們使用的是外輪廓,還可以查找所有輪廓,即包括一些孔洞的部分,像圖像人物胳膊與腰間形成的輪廓。第4個參數說明了輪廓表示的方法,程序中的參數說明輪廓包括了所有點,也可以用其他參數讓有點直線的地方,只保存直線起始與終點的位置點,具體參數用法可以參考手冊里函數的介紹。

第二個函數drawContours是一個畫輪廓的函數,它的第3個參數程序里設置-1表示所有的輪廓都畫,你也可以指定要畫的輪廓的序號。

提取到輪廓后,其實我們更關心的是如果把這些輪廓轉換為可以利用的特征,也就是涉及到輪廓的描述問題,這時就有多種方法可以選擇,比如矢量化為多邊形、矩形、橢圓等。OpenCV里提供了一些這樣的函數。

// 輪廓表示為一個矩形 Rect r = boundingRect(Mat(contours[0])); rectangle(result, r, Scalar(255), 2); // 輪廓表示為一個圓 float radius; Point2f center; minEnclosingCircle(Mat(contours[1]), center, radius); circle(result, Point(center), static_cast<int>(radius), Scalar(255), 2); // 輪廓表示為一個多邊形 vector<Point> poly; approxPolyDP(Mat(contours[2]), poly, 5, true); vector<Point>::const_iterator itp = poly.begin(); while (itp != (poly.end() - 1)) {   line(result, *itp, *(itp + 1), Scalar(255), 2);   ++itp; } line(result, *itp, *(poly.begin()), Scalar(255), 2); // 輪廓表示為凸多邊形 vector<Point> hull; convexHull(Mat(contours[3]), hull); vector<Point>::const_iterator ith = hull.begin(); while (ith != (hull.end() - 1)) {   line(result, *ith, *(ith + 1), Scalar(255), 2);   ++ith; } line(result, *ith, *(hull.begin()), Scalar(255), 2); 

程序中我們依次畫了矩形、圓、多邊形和凸多邊形。最終效果如下:

對連通區域的分析到此遠遠沒有結束,我們可以進一步計算每一個連通區域的其他屬性,比如:重心、中心矩等特征,這些內容以后有機會展開來寫。

以下幾個函數可以嘗試:minAreaRect:計算一個最小面積的外接矩形,contourArea可以計算輪廓內連通區域的面積;pointPolygenTest可以用來判斷一個點是否在一個多邊形內。mathShapes可以比較兩個形狀的相似性,相當有用的一個函數。

總結

以上就是本文關于C語言實現opencv提取直線、輪廓及ROI實例詳解的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美综合v| 国产精品一区二区三| 欧美视频在线观看免费| 欧美性猛交xxxxx免费看| 亚州精品天堂中文字幕| 欧美国产日韩免费| 91干在线观看| 欧美激情精品在线| 一区二区亚洲精品国产| 国产日韩欧美夫妻视频在线观看| 亚洲午夜精品久久久久久久久久久久| 国产精品美腿一区在线看| 欧美性极品xxxx娇小| 久久综合五月天| 国产精品久久久999| 成人午夜激情网| 国产亚洲精品激情久久| 91av视频在线播放| 国产精品黄色影片导航在线观看| 日韩精品极品视频| 亚洲精品一区中文字幕乱码| 69av在线视频| 国产精品免费电影| 欧美电影电视剧在线观看| 国产视频久久久| 亚洲色图美腿丝袜| 亚洲精品国产精品自产a区红杏吧| 97色在线视频| 精品高清一区二区三区| 亚洲第一综合天堂另类专| 欧美激情奇米色| 欧美在线视频播放| 国内精品国产三级国产在线专| 欧美日韩一区二区三区| 日韩在线视频中文字幕| 午夜精品久久久久久久男人的天堂| 欧美激情网站在线观看| 国产97人人超碰caoprom| 日本高清不卡的在线| 国产精品国产自产拍高清av水多| 欧美在线视频a| 精品一区电影国产| 亚洲区免费影片| 国产精品mp4| 中文字幕亚洲欧美在线| 一个人看的www久久| 欧美日韩国产一区在线| 国产精品专区h在线观看| 久久国产加勒比精品无码| 九色成人免费视频| 亚洲香蕉成人av网站在线观看| 亚洲国产高潮在线观看| 亚洲精品之草原avav久久| 亚洲一区免费网站| 91精品国产色综合久久不卡98口| 最近中文字幕2019免费| 欧美日韩在线免费观看| 欧美日韩精品二区| 欧美精品免费在线观看| 亚洲欧洲在线播放| 久久久视频免费观看| 亚洲精品视频中文字幕| 国产精品极品美女粉嫩高清在线| 98精品国产自产在线观看| 欧美激情视频一区| 国产不卡视频在线| 国产成人一区二区三区| 国产日韩欧美视频在线| 亚洲激情国产精品| 精品国产老师黑色丝袜高跟鞋| 国产亚洲精品美女久久久久| 一区二区三区久久精品| 欧美视频一区二区三区…| 欧洲一区二区视频| 国产精品高精视频免费| 国产日本欧美在线观看| 久久久爽爽爽美女图片| 精品国产欧美成人夜夜嗨| 欧美激情一区二区久久久| 日韩av123| 日产精品99久久久久久| 亚洲欧美一区二区三区在线| 亚洲美女免费精品视频在线观看| xvideos亚洲人网站| 日韩成人av网| 成人午夜黄色影院| 九九久久精品一区| 国产一区二区日韩| 亚洲香蕉伊综合在人在线视看| 精品国模在线视频| 一区二区三区美女xx视频| 久久精品国产电影| 国产一区二中文字幕在线看| 欧美成aaa人片免费看| 亚洲国产精品女人久久久| 97在线观看视频| 亚洲成人999| 国产欧美最新羞羞视频在线观看| 欧美精品18videosex性欧美| 国产伦精品一区二区三区精品视频| 北条麻妃一区二区三区中文字幕| 欧美精品在线看| 国精产品一区一区三区有限在线| 91精品国产一区| 中文字幕精品www乱入免费视频| 色婷婷**av毛片一区| 国产日本欧美一区二区三区在线| 国产成人精品久久亚洲高清不卡| 亚洲欧美日韩一区在线| 精品性高朝久久久久久久| 狠狠做深爱婷婷久久综合一区| 成人免费网站在线观看| 热草久综合在线| 8050国产精品久久久久久| 98午夜经典影视| 欧美一级高清免费| 日韩在线中文视频| 欧美性受xxxx白人性爽| 正在播放欧美一区| 久久精品国产一区二区电影| 欧美与黑人午夜性猛交久久久| 国产亚洲精品日韩| 不卡伊人av在线播放| 国产精品欧美一区二区三区奶水| 中文字幕亚洲一区二区三区| 一区二区三区国产在线观看| 日韩av在线网页| 欧美成人h版在线观看| 日韩精品中文字幕视频在线| 欧美孕妇孕交黑巨大网站| 亚洲精品在线看| 国产精品视频网| 欧美日韩激情美女| 亚洲综合色激情五月| 成人网欧美在线视频| 欧美性生活大片免费观看网址| 欧美性猛交xxxx偷拍洗澡| …久久精品99久久香蕉国产| 中文字幕精品网| 午夜精品久久久99热福利| 91中文字幕在线| 国产玖玖精品视频| 亚洲新中文字幕| 91在线免费观看网站| 久久中文字幕一区| 久久久久久美女| 久久久在线观看| 久久全球大尺度高清视频| 亚洲精品国产成人| 日韩亚洲成人av在线| 亚洲欧美变态国产另类| 精品人伦一区二区三区蜜桃网站| 成人国产在线激情| 亚洲一区二区久久久久久| www.久久久久| 大荫蒂欧美视频另类xxxx| 欧美日韩国产麻豆| 91国内精品久久| 91香蕉嫩草神马影院在线观看| 国产视频观看一区| 亚洲精品电影网站| 欧美成人免费视频| 欧美激情一区二区三区在线视频观看| 欧美大片在线看|