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

来源:互联网 发布:淘宝不能使用图片搜索 编辑:程序博客网 时间:2024/05/05 22:37

直线检测:

    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)表示用红色描线



0 0