opencvapproxDP多边形逼近获取四边形轮廓信息_第1页
opencvapproxDP多边形逼近获取四边形轮廓信息_第2页
opencvapproxDP多边形逼近获取四边形轮廓信息_第3页
全文预览已结束

下载本文档

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

文档简介

[opencv]approxDP多边形逼近获取四边形轮廓信息#include"opencv2/opencv.hpp"#include<iostream>#include<math.h>#includestring.h>usingnamespacecv;usingnamespacestd;intthresh=50,N=11;constchar*wndname="SquareDetectionDemo";intcalcdistance(Point_<int>&point1,Point_<int>point2){intx1=point1.x;inty1=point1.y;intx2=point2.x;inty2=point2.y;intdist=sqrt(pow(x2-x1,2)+pow(y2-x1,2));returndist;}//查找向量之间的⾓度余弦//pt0->pt1pt0->pt2staticdoubleangle(Pointpt1,Pointpt2,Pointpt0){doubledx1=pt1.x-pt0.x;doubledy1=pt1.y-pt0.y;doubledx2=pt2.x-pt0.x;doubledy2=pt2.y-pt0.y;return(dx1*dx2+dy1*dy2)/sqrt((dx1*dx1+dy1*dy1)*(dx2*dx2+dy2*dy2)+1e-10);//cos<a,b>=(ab)/(|a||b|)}//返回图像上检测到的正⽅形序列//序列存储在指定的内存存储器中staticvoidfindSquares(constMat&image,vector<vector<Point>>&squares){inth=image.rows;intw=image.cols;squares.clear();Matpyr,timg,gray0(image.size(),CV_8U),gray;//缩⼩和放⼤图像以滤除噪⾳pyrDown(image,pyr,Size(image.cols/2,image.rows/2));//⾼斯降噪,并只取奇数⾏列缩⼩图⽚pyrUp(pyr,timg,image.size());//插⼊偶数⾏列,再次⾼斯降噪vector<vector<Point>>contours;//在图像的每个颜⾊平⾯中查找正⽅形for(intc=0;c<3;c++){intch[]={c,0};mixChannels(&timg,1,&gray0,1,ch,1);//尝试⼏个阈值级别for(intl=0;l<N;l++){if(l==0){Canny(gray0,gray,0,thresh,5);dilate(gray,gray,Mat(),Point(-1,-1));}else{//applythresholdifl!=0://tgray(x,y)=gray(x,y)<(l+1)*255/N?255:0gray=gray0>=(l+1255/N;}//_RETR_LIST参数指明最后只存了⾓点位置findContours(gray,contours,RETR_LIST,CHAIN_APPROX_SIMPLE);vector<Point>approx;//testeachcontour//⼀次取⼀个轮廓判断下是不是矩形for(size_ti=0;i<contours.size();i++){//approx存储了近似后的轮廓approxPolyDP(Mat(contours[i]),approx,arcLength(Mat(contours[i]),true0.02,true);if(approx.size()==4&&//矩形必须是四个点fabs(contourArea(Mat(approx)))>5000&&isContourConvex(Mat(approx)))//必须是凸的,咋理解{doublemaxCosine=0;for(intj=2;j<5;j++){//findthemaximumcosineoftheanglebetweenjointedgesdoublecosine=fabs(angle(approx[j%4],approx[j-2],approx[j-1]));maxCosine=MAX(maxCosine,cosine);}//1,2,3顶点的⾓余弦,最⼤的余弦值,对应三个⾓中的最⼩⾓,也就是三个⾓中,最不像直⾓的//为什么是三个呢?三个中最不像直⾓的都接近直⾓了,剩下的⾃然也是直⾓if(maxCosine<0.3)if(calcdistance(approx[0],approx[3])<h&&calcdistance(approx[0],approx[1])<w){squares.push_back(approx);}}}}}}//函数绘制图像中的所有四边形staticvoiddrawSquares(Mat&image,constvector<vector<Point>>&squares){for(size_ti=0;i<squares.size();i++){constPoint*p=&squares[i][0];intn=(int)squares[i].size();circle(image,squares[i][0],3,Scalar(0,0,255),1);circle(image,squares[i][1],3,Scalar(0,0,255),1);circle(image,squares[i][2],3,Scalar(0,0,255),1);circle(image,squares[i][3],3,Scalar(0,0,255),1);////polylines(image,&p,&n,1,true,Scalar(0,255,0),1,LINE_AA);break;Rectrr=boundingRect(squares[i]);//通过最⼩包围盒来获取主要函数区域vector<vector<Point>>main;main[0][0]=squares[0][0];main[0][1]=squares[0][1];main[0][2]=squares[1][2];main[0][3]=squares[1][3];circle(image,main[0][0],1,Scalar(0,255,0),-1);circle(image,main[0][1],1,Scalar(0,255,0),-1);imshow("main",image);RotatedRectminRect=minAreaRect(Mat(main[0]));Point2fvertex[4];//⽤于存放最⼩矩形的四个顶点minRect.points(vertex);//vertex//绘制最⼩⾯积包围矩形vector<Point>min_rectangle;for(inti=0;i<4;){line(image,vertex[i],vertex[(i+1)%4],Scalar(0,255,255),1,8);//⾮常巧妙的表达式min_rectangle.push_back(vertex[i]);//Pointvector容器中}////////rectangle(image,Point(rr.x,rr.y),Point(rr.x+rr.width,rr.y+rr.height),1);floatarea=contourArea(squares[i],false);cout<<"area=="<<area<<endl;break;}imshow(wndname,image);}intmain(int/*argc*/,char**/*argv*/){Matimage=imread("/home/leoxae/KeekoRobot/TestPic//1.png");vector<vector<Point>>squares;findSquares(image,squares);for(autoitx=squares.begin();itx!=squares.end();itx++){vector<Point>points=*itx;cout<<"Pts="<<points<<endl;}/*Pointb_tl=squares[0][0];Pointb_tr=squares[0][1];Pointb_bl=squares[0][2];Pointb_br=squares[0][3];Points_tl=squares[1][0];Points_tr=squares[1][1];Points_bl=squares[1][2];Points_br=squares[1][3];cout<<"b_tl=="<<b_tl<<endl;cout<<"b_tr=="<<b_tr<<endl;cout<<"b_bl=="<<b_bl<<endl;cout<<"b_br=="<<b_br<<endl;cout<<"s_tl=="<<s_tl<<endl;cout<<"s_tr=="<<s_tr<<endl;cout<<"s_bl=="<<s_bl<<endl;cout<<"s_br=="<<s_br<<endl;circle(image,b_bl,3,Scalar(0,0,255),-1);circle(image,b_tr,3,Scalar(0,0,255),-1);circle(image,b_bl,3,Scalar(0,0,255),-1);circle(image,b_br,3,Scalar(0,0,255),-1);circl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论