您的位置:首页 > 移动开发 > IOS开发

ios--OpenCV--检测直线、圆、矩形

2014-04-15 11:38 501 查看
直线检测:

IplImage * src_Img= srcIpl1;
IplImage * edge_Img=NULL;

edge_Img=cvCreateImage(cvGetSize(src_Img),IPL_DEPTH_8U,1);
IplImage *temp_Img=cvCreateImage(cvGetSize(src_Img),IPL_DEPTH_8U,1);
cvCvtColor(src_Img,temp_Img,CV_BGR2GRAY);
cvCanny(temp_Img,edge_Img,25,50);//threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
//hough变化直线检测
CvMemStorage *storage=cvCreateMemStorage(0);//内存采用默认大小
CvSeq * lines=0;
lines=cvHoughLines2(edge_Img,storage,CV_HOUGH_STANDARD,1,CV_PI/180,150);
for (int i=0;i<MIN(lines->total,100);i++)
{
float *line=(float *)cvGetSeqElem(lines,i);
float rho =line[0];
float theta=line[1];
//cout<<"rho:"<<rho<<",theta:"<<theta<<endl;//注意坐标系采用图像坐标系,坐标原点在左上角
CvPoint pt1,pt2;
double a=cos(theta),b=sin(theta);
double x0=a*rho,y0=b*rho;
pt1.x=cvRound(x0 + 500*(-b));
pt1.y=cvRound(y0 + 500*(a));
pt2.x=cvRound(x0 - 500*(-b));
pt2.y=cvRound(y0 - 500*(a));
cvLine(src_Img,pt1,pt2,CV_RGB(255,0,0),1,CV_AA,0);
//cout<<x0<<","<<y0<<endl;//如果点不在图像内,那么选在这条直线上离这个点最近的点开始画

}


圆检测:

IplImage * src_Img= srcIpl1;
IplImage * edge_Img=NULL;

edge_Img=cvCreateImage(cvGetSize(src_Img),IPL_DEPTH_8U,1);
IplImage *temp_Img=cvCreateImage(cvGetSize(src_Img),IPL_DEPTH_8U,1);
cvCvtColor(src_Img,temp_Img,CV_BGR2GRAY);
CvMemStorage *storage=cvCreateMemStorage(0);//内存采用默认大小
CvSeq* circles = cvHoughCircles( temp_Img, storage, CV_HOUGH_GRADIENT, 2, temp_Img->height/4, 80, 40 );
for(int i = 0; i < circles->total; i++ )
{
float* p = (float*)cvGetSeqElem( circles, i);
cvCircle( src_Img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );
cvCircle( src_Img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
}


画矩形框:

cvRectangle(srcResult, mincvPoint, maxcvPoint, cvScalar(0,0,255));
//srcResult表示目标图片
//mincvPoint表示矩形左上角的点cvPoint
//maxcvPoint表示矩形右下角的点cvPoint
//cvScalar(0,0,255)表示用红色描线
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: