利用opencv逼近二值圖像的邊界點並過濾不需要的邊界達到尋邊效果_第1頁
利用opencv逼近二值圖像的邊界點並過濾不需要的邊界達到尋邊效果_第2頁
利用opencv逼近二值圖像的邊界點並過濾不需要的邊界達到尋邊效果_第3頁
利用opencv逼近二值圖像的邊界點並過濾不需要的邊界達到尋邊效果_第4頁
利用opencv逼近二值圖像的邊界點並過濾不需要的邊界達到尋邊效果_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、HYPERLINK /rocky69/article/details/7244226利用opencv逼近二值圖像的邊界點,並過濾不需要的邊界,達到尋邊效果 二值化圖像;利用黑白像素值求差,得到邊緣點;過濾邊緣點找到合適區(qū)域;利用cvFitLine2D擬合線。 做的比較粗糙,搜尋時間在10ms左右,希望有研究opencv的朋友斧正。效果預覽:、 cpp HYPERLINK /c2716266/article/details/7191460#view plainHYPERLINK /c2716266/article/details/7191460#copyvoid CvProcess:FindLi

2、ne( IplImage* orgImg ,/原始圖像 IplImage*runImg,/顯示用圖像 CvRect rec,/roi int thredValue,/二值化閾值 int lineAccuracy,/搜索精度 int SearchDirection,/搜索方向 int EdgePolarity)/搜索方式 黑到白 白到黑 cvCopy(orgImg,runImg);/原始圖像拷貝到顯示圖像用於顯示 IplImage* thrdImg = cvCreateImage(/創(chuàng)建一個單通道二值圖像用於各種處理 cvSize(orgImg-width,orgImg-height), IPL

3、_DEPTH_8U, 1); /將原始圖像轉(zhuǎn)換為單通道灰度圖像 cvCvtColor(runImg,thrdImg,CV_BGR2GRAY); /二值化處理 cvThreshold( thrdImg, thrdImg, thredValue, 255, CV_THRESH_BINARY); / cvNamedWindow(); / cvShowImage(,thrdImg); if(rec.width0&rec.width0&rec.widthIMAGE_HEIGHT)/判斷是否有適合的ROI區(qū)域 /設(shè)置ROI cvSetImageROI(runImg,rec); cvSetImageROI(

4、thrdImg,rec); /搜索邊界 CvPoint2D32f *EdgePoint2D = /用於存儲搜索到的所有邊界點 (CvPoint2D32f *)malloc(IMAGE_HEIGHT*IMAGE_WIDTH) * sizeof(CvPoint2D32f); CvPoint2D32f *RelEdgePoint2D =/用於存儲搜索到的正確的點 (CvPoint2D32f *)malloc(IMAGE_HEIGHT*IMAGE_WIDTH) * sizeof(CvPoint2D32f); int EdgePoint2DCount=0;/點計數(shù) int RelEdgePoint2DC

5、ount=0; /真實點計數(shù) float *line = new float4; /用於畫逼近線 byte ftData=0,secData=0; /搜索邊界點所需資源 /得到ROI區(qū)域內(nèi)的搜索線 std:vector searchlines = GetRecLines(rec,lineAccuracy,SearchDirection); switch(SearchDirection)/搜索方向 case TB : /上到下縱向搜索 for (int i=0;iroi-width;i+) for (int j=0;jroi-height-1;j+) /上下搜索所有的差值大於200的點 ftDa

6、ta=CV_IMAGE_ELEM(thrdImg,uchar,thrdImg-roi-yOffset+j,thrdImg-roi-xOffset+i);/利用宏直接得到結(jié)果 /ftData=(thrdImg-imageData + i * thrdImg-widthStep)j;/注意這裡是 寬度用的是 widthStep 而不是 width secData=CV_IMAGE_ELEM(thrdImg,uchar,thrdImg-roi-yOffset+j+1,thrdImg-roi-xOffset+i); switch(EdgePolarity) case B2W: if(secData-f

7、tData200)/黑到白 for(int n=0;nsearchlines.size();n+)/搜索在搜索線上的點 if (searchlinesn.PTS.x=i&searchlinesn.PTS.yj) EdgePoint2DEdgePoint2DCount=cvPoint2D32f(i,j); if (EdgePoint2DCount0)/大於2點時比較 bool realPoint=TRUE; /刪除X坐標相同的縱向點,減少逼近時誤判幾率 for (int m=1;m200)/白到黑 for(int n=0;nsearchlines.size();n+)/搜索在搜索線上的點 if

8、(searchlinesn.PTS.x=i&searchlinesn.PTS.yj) EdgePoint2DEdgePoint2DCount=cvPoint2D32f(i,j); if (EdgePoint2DCount0)/大於2點時比較 bool realPoint=TRUE; /刪除X坐標相同的縱向點,減少逼近時誤判幾率 for (int m=1;m2)/當找到的點大於2時在搜尋逼近線 /找出逼近線 cvFitLine2D(RelEdgePoint2D,RelEdgePoint2DCount, CV_DIST_L1,NULL,0.01,0.01,line); CvPoint FirstP

9、oint;/起點 CvPoint LastPoint;/終點 FirstPoint.x=int (line2-1000*line0); FirstPoint.y=int (line3-1000*line1); LastPoint.x=int (line2+1000*line0); LastPoint.y=int (line3+1000*line1); cvLine( runImg, FirstPoint, LastPoint, CV_RGB(255,0,0), 1, CV_AA);/畫出逼近線 break; case LR : /左到右橫向搜索 for (int j=0;jroi-height

10、;j+) for (int i=0;iroi-width-1;i+) ftData=CV_IMAGE_ELEM(thrdImg,uchar,thrdImg-roi-yOffset+j,thrdImg-roi-xOffset+i);/利用宏直接得到結(jié)果 /ftData=(thrdImg-imageData + i * thrdImg-widthStep)j;/注意這裡是 寬度用的是 widthStep 而不是 width secData=CV_IMAGE_ELEM(thrdImg,uchar,thrdImg-roi-yOffset+j,thrdImg-roi-xOffset+i+1); swit

11、ch(EdgePolarity) case B2W: if(secData-ftData200)/黑到白 for(int n=0;nsearchlines.size();n+)/point in searchlines if (searchlinesn.PTS.y=j&searchlinesn.PTS.xi) EdgePoint2DEdgePoint2DCount=cvPoint2D32f(i,j); if (EdgePoint2DCount0)/大於2點時比較 bool realPoint=TRUE; for (int m=1;m200)/白到黑 for(int n=0;nsearchlin

12、es.size();n+)/找出在搜索線上的點 if (searchlinesn.PTS.y=j&searchlinesn.PTS.xi) EdgePoint2DEdgePoint2DCount=cvPoint2D32f(i,j); if (EdgePoint2DCount0)/大於2點時比較 bool realPoint=TRUE; for (int m=1;m2) cvFitLine2D(RelEdgePoint2D,RelEdgePoint2DCount, CV_DIST_L1,NULL,0.01,0.01,line); CvPoint FirstPoint;/起點 CvPoint La

13、stPoint;/終點 FirstPoint.x=int (line2-1000*line0); FirstPoint.y=int (line3-1000*line1); LastPoint.x=int (line2+1000*line0); LastPoint.y=int (line3+1000*line1); cvLine( runImg, FirstPoint, LastPoint, CV_RGB(255,0,0), 1, CV_AA);/畫出逼近線 break; /釋放資源 free(EdgePoint2D); free(RelEdgePoint2D); delete line; se

14、archlines.clear(); cvResetImageROI(runImg); cvResetImageROI(thrdImg); DrawRecLines(runImg,rec,lineAccuracy,SearchDirection); /釋放資源 cvReleaseImage(&thrdImg); /畫ROI時候 連帶畫出搜索線 void CvProcess:DrawRecLines(IplImage* runImg,CvRect rec,int lineAccuracy,int SearchDirection) cvRectangleR(runImg,rec,CV_RGB(0,

15、255,0),1, CV_AA,0); CvPoint RecPS=cvPoint(rec.x,rec.y), RecPE=cvPoint(rec.x+rec.width,rec.y+rec.height); switch(SearchDirection) case TB : for (int i=1;ilineAccuracy;i+) CvPoint Ps=cvPoint(double)rec.width/lineAccuracy)*i+RecPS.x,RecPS.y); CvPoint Pe=cvPoint(double)rec.width/lineAccuracy)*i+RecPS.x,

16、RecPE.y); cvLine(runImg,Ps,Pe,CV_RGB(0,255,255),1, CV_AA,0); break; case LR : for (int i=1;ilineAccuracy;i+) CvPoint Ps=cvPoint(RecPS.x,(double)rec.height/lineAccuracy)*i+RecPS.y); CvPoint Pe=cvPoint(RecPE.x,(double)rec.height/lineAccuracy)*i+RecPS.y); cvLine(runImg,Ps,Pe,CV_RGB(0,255,255),1, CV_AA,

17、0); break; /得到ROI內(nèi)部搜索線 std:vector CvProcess:GetRecLines(CvRect rec,int lineAccuracy,int SearchDirection) std:vector SearchLines; CLine line; rec.x=0;/坐標轉(zhuǎn)換值ROI區(qū)域 rec.y=0; CvPoint RecPS=cvPoint(rec.x,rec.y), RecPE=cvPoint(rec.x+rec.width,rec.y+rec.height); switch(SearchDirection) case TB : for (int i=1;ilineAccuracy;i+) line.PTS=cvPoint(double)rec.width/lineAccuracy)*i+RecPS.x,RecPS.y); line.PTE=cvPoint(double)rec.width/lineAccuracy)*i+RecPS.x,RecPE.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論