利用opencv逼近二值圖像的邊界點並過濾不需要的邊界達到尋邊效果_第1页
利用opencv逼近二值圖像的邊界點並過濾不需要的邊界達到尋邊效果_第2页
利用opencv逼近二值圖像的邊界點並過濾不需要的邊界達到尋邊效果_第3页
利用opencv逼近二值圖像的邊界點並過濾不需要的邊界達到尋邊效果_第4页
利用opencv逼近二值圖像的邊界點並過濾不需要的邊界達到尋邊效果_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、HYPERLINK /rocky69/article/details/7244226利用opencv逼近二值圖像的邊界點,並過濾不需要的邊界,達到尋邊效果 二值化圖像;利用黑白像素值求差,得到邊緣點;過濾邊緣點找到合適區域;利用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(/創建一個單通道二值圖像用於各種處理 cvSize(orgImg-width,orgImg-height), IPL

3、_DEPTH_8U, 1); /將原始圖像轉換為單通道灰度圖像 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區域 /設置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;/點計數 int RelEdgePoint2DC

5、ount=0; /真實點計數 float *line = new float4; /用於畫逼近線 byte ftData=0,secData=0; /搜索邊界點所需資源 /得到ROI區域內的搜索線 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);/利用宏直接得到結果 /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);/利用宏直接得到結果 /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內部搜索線 std:vector CvProcess:GetRecLines(CvRect rec,int lineAccuracy,int SearchDirection) std:vector SearchLines; CLine line; rec.x=0;/坐標轉換值ROI區域 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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论