生活随笔
收集整理的這篇文章主要介紹了
OpenCV实现连通域
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????????借此代碼實現連通域,原文鏈接:http://blog.csdn.net/augusdi/article/details/8865694
????? ? 如有疑問或者版權問題,請移步原作者或者告知本人。
????????比較詳細的其他方法,如 一般鄰域遍歷方法 或者 兩遍掃描法,可在這篇文章中找到:
????????OpenCV連通域分析與標記
1. 借用的代碼:
//連通區域結構 typedef struct MyConnectedComp { double area; int value; RECT rect; list<POINT> listAllPoint; }MyConnectedComp /* *功能說明:統計圖像的連通區域 *參數說明:src,表示原始圖象;rectSrc,表示圖像區域;listData,表示連通域結構鏈表;nUnionColor,表示連通顏色(0,表示黑點;1,表示白點);nUnionMode,表示連通類型(0,表示4連通;1,表示8連通) *返回值:int類型。-1,表示參數錯誤;0,表示非二值/灰度圖像 */ int ImageUnionByFloodFill(CxImage *src,RECT rectSrc,list<MyConnectedComp> &listData,int nUnionColor,int nUnionMode) { int nRet = 1; //參數檢測 if(src==NULL || !(nUnionColor==0||nUnionColor==1) || !(nUnionMode==1||nUnionMode==2) || (rectSrc.left==0 && rectSrc.right==0 || rectSrc.top==0 && rectSrc.bottom==0 || rectSrc.left>rectSrc.right || rectSrc.top>rectSrc.bottom)) { nRet = -1; return nRet; } if(src->GetBpp()>8) { nRet = 0; return nRet; } listData.clear(); int nColor = 255; if(nUnionColor==0) { nUnionColor = 255; } if(nUnionColor==1) { nUnionColor = 0; } int nFlag = 4; if(nUnionMode==1) { nFlag = 4; } if(nUnionMode==2) { nFlag = 8; } int iBackColor = GetBlackColor(*src); long i = 0,j = 0; long m = 0,n = 0,newN = 0,newM = 0; long nWidth = 0,nHeight = 0; IplImage *pcvImageTmp = NULL; if(!Cximage2IplImage(src,&pcvImageTmp)) { return 0; } //如果是灰度圖像,做二值化處理 if(src->GetBpp()!=1) { cvThreshold(pcvImageTmp,pcvImageTmp,128,255,CV_THRESH_BINARY); } CvSize size = cvGetSize(pcvImageTmp); DatumnConnectedComp dccTmp; CvConnectedComp comp; CvPoint seed; for(j=rectSrc.top;j<rectSrc.bottom;j++) { for(i=rectSrc.left;i<rectSrc.right;i++) { if(i<0 || i>=size.width || j<0 || j>=size.height) { continue; } uchar *p = (uchar *)&(pcvImageTmp->imageData+j*pcvImageTmp->widthStep)[i]; if(*p==nUnionColor || *p==100 || *p==101) { continue; } //處理為黑點,做連通 seed = cvPoint(i,j); cvFloodFill(pcvImageTmp, seed,cvScalarAll(100), cvScalarAll(0),cvScalarAll(0), &comp, nFlag, 0 ); dccTmp.area = comp.area; dccTmp.rect.left = comp.rect.x; dccTmp.rect.top = comp.rect.y; dccTmp.rect.right = comp.rect.x + comp.rect.width; dccTmp.rect.bottom = comp.rect.y + comp.rect.height; dccTmp.value = int(comp.value.val[1]); dccTmp.listAllPoint.clear(); POINT ptInsert; for(n=0;n<=comp.rect.height;n++) { for(m=0;m<comp.rect.width;m++) { newN = n + comp.rect.y; newM = m + comp.rect.x; if(newN>=size.height || newM>=size.width) { continue; } uchar *q = (uchar *)&(pcvImageTmp->imageData+newN*pcvImageTmp->widthStep)[newM]; if(*q==100) { ptInsert.x = newM; ptInsert.y = newN; dccTmp.listAllPoint.push_back(ptInsert); *q = 101;//改變標記,說明已被連通 } } } listData.push_back(dccTmp); } } cvReleaseImage(&pcvImageTmp); return nRet; }
總結
以上是生活随笔為你收集整理的OpenCV实现连通域的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。