Hough变换检测圆和直线(作业2)

来源:互联网 发布:常用算法的时间复杂度 编辑:程序博客网 时间:2024/05/09 00:34

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main()
{
    IplImage *img=cvLoadImage("/home/eve/Download/homework 2/chess.jpg");
    IplImage* src = cvLoadImage("/home/eve/Download/homework 2/chess.jpg", 0 );
    IplImage* dst= cvCreateImage(cvGetSize(src),IPL_DEPTH_8U, 1 );
//    IplImage *dst_color=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U, 3 );

    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* lines = 0;
    CvRect roi=cvRect(0,200,1000,500);
    int i;
    cvCanny(src, dst, 150, 300, 3 );    //canny边缘检测

 //   cvCvtColor(dst,dst_color,CV_GRAY2BGR);
    cvSetImageROI(dst,roi);
//    cvSetImageROI(dst_color,roi);
    cvSetImageROI(img,roi);

    lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180,90,10,90 );  //probablistic

    for( i = 0; i < lines->total; i++ )
    {
        CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
       // cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0 );
        cvLine(img, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0 );   //画在原图
    }

    cvResetImageROI(img);

    //********************************************** line detected
    int j;
 //   IplImage *img=cvLoadImage("/home/eve/Download/homework 2/chess.jpg");
    IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );  //输入 8-比特、单通道灰度图像.
    IplImage *edges=cvCreateImage(cvGetSize(img), 8, 1);
    CvMemStorage* storage2 = cvCreateMemStorage(0);

    cvCvtColor( img, gray, CV_BGR2GRAY );
    IplImage *dst2=cvCreateImage( cvGetSize(img), 8, 1 );
 //   IplImage* color_dst=cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 );
    cvCanny(gray,edges,150,300,3);
  //  cvCvtColor(edges, color_dst, CV_GRAY2BGR );
  //  cvShowImage("color_dst",color_dst);
    cvThreshold(gray,dst2,120,255,CV_THRESH_BINARY);
    CvSeq* circles = cvHoughCircles(dst2, storage2, CV_HOUGH_GRADIENT,2,
                                            30,300,120,10,65);
    for( j = 0; j < circles->total; j++ )
 {
     float* p = (float*)cvGetSeqElem( circles, j );
     cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 0.5, CV_RGB(0,255,0), -1, 8, 0 );
     cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(0,0,255), 3, 8, 0 );
    //cvCircle(CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int lineType=8, int shift=0)
 }
   // cvShowImage("circles",img);
    cvShowImage("hough",img);
    cvWaitKey(0);
    cvSaveImage("hough.jpg",img) ;
    return 0;
}


#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main()
{
    IplImage *img=cvLoadImage("/home/eve/Download/homework 2/figures2.jpg");
    IplImage* src = cvLoadImage("/home/eve/Download/homework 2/figures2.jpg", 0 );
    IplImage* dst= cvCreateImage(cvGetSize(src),IPL_DEPTH_8U, 1 );
//    IplImage *dst_color=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U, 3 );

    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* lines = 0;
    int i;
    cvCanny(src, dst, 50, 150, 3 );    //canny边缘检测
 //   cvShowImage("dst",dst);
 //   cvCvtColor(dst,dst_color,CV_GRAY2BGR);
 //   lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180,90,10,90 );  //probablistic
    lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180,50,60,50 );
    for( i = 0; i < lines->total; i++ )
    {
        CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
       // cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0 );
        cvLine(img, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0 );   //画在原图
    }

    //********************************************** line detected

    int j;
 //   IplImage *img=cvLoadImage("/home/eve/Download/homework 2/chess.jpg");
    IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );  //输入 8-比特、单通道灰度图像.
    IplImage *edges=cvCreateImage(cvGetSize(img), 8, 1);
    CvMemStorage* storage2 = cvCreateMemStorage(0);
    cvCvtColor( img, gray, CV_BGR2GRAY );
  //  cvShowImage("gray",gray);
    IplImage *dst2=cvCreateImage( cvGetSize(img), 8, 1 );
 //   IplImage* color_dst=cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 );
    cvCanny(gray,edges,75,150,3);
  //  cvShowImage("edges",edges);
  //  cvCvtColor(edges, color_dst, CV_GRAY2BGR );
  //  cvShowImage("color_dst",color_dst);
    cvThreshold(edges,dst2,120,255,CV_THRESH_BINARY);
   //cvShowImage("dst2",dst2);
    //800*600;
 //   CvSeq* circles = cvHoughCircles(dst2, storage2, CV_HOUGH_GRADIENT,1,
 //                                           350,200,37);
      CvSeq* circles = cvHoughCircles(dst2, storage2, CV_HOUGH_GRADIENT,2,
                                              60,200,120,10,200);

    for( j = 0; j < circles->total; j++ )
 {
     float* p = (float*)cvGetSeqElem( circles, j );
   //  cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 0.5, CV_RGB(0,255,0), -1, 8, 0 );
     cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(0,0,255), 3, 8, 0 );
 }
   // cvShowImage("circles",img);
   cvShowImage("hough",img);
    cvWaitKey(0);
    return 0;
}


原创粉丝点击