OpenCV查找轮廓
生活随笔
收集整理的這篇文章主要介紹了
OpenCV查找轮廓
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
轉(zhuǎn)自:http://westice.javaeye.com/blog/721225
?
- 主要函數(shù)是???????cvFindContours(tour_buf,storage,&contour,sizeof(CvContour),? ??
- ????????????????????????????????CV_RETR_EXTERNAL,?CV_CHAIN_APPROX_SIMPLE); ??
- ?????????????????tour_buf?是需要查找輪廓的單通道灰度圖像?,storage?是臨時存儲區(qū)?, ??
- ?????????????????contour是存儲輪廓點的CvSeq實例, ??
- ?????????????????CV_RECT_EXTERNAL?只查找外圍輪廓,還有CV_RECT_TREE? ??
- ????????????????? ??
- ?????????????????正確調(diào)用查找函數(shù)后,就是從contour提取輪廓點了 ??
- ?????????????????contour可能是空指針,提取前最好判斷一下 ??
- ?????????????????在提取之前還可以調(diào)用一個函數(shù): ??
- ?????????????????contour?=?cvApproxPoly(?contour,?sizeof(CvContour),?storage,?CV_POLY_APPROX_DP,?3,?1?); ??
- ?????????????????可能是擬合,有這一句找出的輪廓線更直。 ??
- ????????????????? ??
- ?????????????????contour里面包含了很多個輪廓,每個輪廓是單獨存放的 ??
- ?????????????????要通過一個迭代器遍歷里面每一個輪廓,教程里面都沒提到,還是看了源代碼學來的 ??
- ?????????????????CvTreeNodeIterator?iterator; ??
- ?????????????????cvInitTreeNodeIterator(&iterator,contour,3); ??
- ?????????????????//把所有輪廓的點收集起來 ??
- ?????????????????CvSeq*?allpointsSeq?=?cvCreateSeq(CV_SEQ_KIND_GENERIC|CV_32SC2,?sizeof(CvContour), ??
- ????????????????????????????????????????????sizeof(CvPoint),?storage); ??
- ?????????????????while(?0?!=?(contour?=?(CvSeq*)cvNextTreeNode(&iterator))?){? ??
- ?????????????????????//找到一個輪廓就可以用for循環(huán)提取里面的點了 ??
- ?????????????????????//這里遍歷CvSeq里面的元素的方法很怪異 ??
- ?????????????????????onetourlength?=?contour->total; ??
- ?????????????????????//給點數(shù)組分配空間,記得釋放 ??
- ?????????????????????CvPoint?*points?=?(CvPoint?*)malloc(sizeof(CvPoint)?*?onetourlength);? ??
- ?????????????????????//printf("seqlength:%d/n",seqlength); ??
- ?????????????????????CvSeqReader?reader; ??
- ?????????????????????CvPoint?pt?=?cvPoint(0,0); ??
- ?????????????????????cvStartReadSeq(contour,&reader); ??
- ?????????????????????//開始提取 ??
- ?????????????????????for(int?i?=?0?;i?<?onetourlength;?i++){ ??
- ?????????????????????????CV_READ_SEQ_ELEM(pt,reader); ??
- ?????????????????????????points[i]?=?pt; ??
- ?????????????????????????cvSeqPush(allpointsSeq,&pt); ??
- ?????????????????????}?? ??
- ?????????????????????//把這個輪廓點找出后,就可以用這些點畫個封閉線 ??
- ?????????????????????cvPolyLine(image,&points,&onetourlength,1,0,CV_RGB(0,255,0),2,8,0); ??
- ????????????????????? ??
- ?????????????????} ??
- ????????????????? ??
- ?????????????????//剛剛已經(jīng)畫出了找出的每個輪廓,還收集了所有輪廓點, ??
- ?????????????????//因此還可以將這些點用一個圍線包圍起來,即把所有輪廓包圍起來 ??
- ?????????????????//這里要用到新的函數(shù) ??
- ?????????????????CvSeq*?hull; ??
- ?????????????????hull?=?cvConvexHull2(allpointsSeq,0,CV_CLOCKWISE,0); ??
- ?????????????????cvConvexHull2返回一個hull對象,里面包含了圍線的點 ??
- ?????????????????可以用上面的方法將點取出,然后畫出來
總結(jié)
以上是生活随笔為你收集整理的OpenCV查找轮廓的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV中常用到的轮廓处理函数汇总
- 下一篇: OpenCV下车牌定位算法实现代码