OpenCV角点检测调试记录

方法1:

cv::cvtColor(pimg0,pimg0,CV_BGR2GRAY);
cv::Canny(pimg0,pimg0,100,150,3);   //边缘检测

cv::cornerHarris(pimg0,pimg0,
                  2,                 //邻域大小
                  5,                 //扩展Sobel核大小
                  0.01
                   ); //检测角点
cv::threshold(pimg0,pimg0, 0.00001, 255, cv::THRESH_BINARY_INV);    //角点结果二值化


方法2:(效果更好,处理更简单)



    cv::Mat m = pimg0.clone();
    cv::Mat pimg2 = m(rect);    //剪切图像--拷贝图像
    cv::Mat pimg3 = pimg0(rect);    //剪切图像--拷贝图像


    int nr2 = pimg3.rows;
    int nc2 = pimg3.cols * pimg3.channels();
    for(int j=0; j         unsigned char * data0 = pimg3.ptr(j);
        for(int i=0; i             data0[i] =255- (255-data0[i])/2;
        }
    }


    cv::Canny(pimg2,pimg2,100,150,3);   //边缘检测


    std::vector corners;
    int maxCorners = 500;     //最大检测角点数
    double qualityLevel = 0.01;
    double minDistance = 10;     //丙个角点之前的距离容忍度
    cv::goodFeaturesToTrack(pimg2, corners,
                            maxCorners,
                            qualityLevel,
                            minDistance);
    //绘制出角点
    int r = 2;
    for(int i=0; i         cv::circle(pimg3,corners[i], r, cv::Scalar(0,0,0),-1,8,0);
    }




---------------------------------

更新:角点匹配方法

转自:http://blog.csdn.net/rueing839/article/details/48807477


  1.  
  2.     //【1】载入素材图  
  3.     Mat srcImage1 = imread("1.jpg", 1);  
  4.     Mat srcImage2 = imread("2.jpg", 1);  
  5.     if (!srcImage1.data || !srcImage2.data)  
  6.     {  
  7.         printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); return false;  
  8.     }  
  9.   
  10.     //【2】使用SURF算子检测关键点  
  11.     int minHessian = 700;//SURF算法中的hessian阈值  
  12.     SurfFeatureDetector detector(minHessian);//定义一个SurfFeatureDetector(SURF) 特征检测类对象    
  13.     std::vector keyPoint1, keyPoints2;//vector模板类,存放任意类型的动态数组  
  14.   
  15.     //【3】调用detect函数检测出SURF特征关键点,保存在vector容器中  
  16.     detector.detect(srcImage1, keyPoint1);  
  17.     detector.detect(srcImage2, keyPoints2);  
  18.   
  19.     //【4】计算描述符(特征向量)  
  20.     SurfDescriptorExtractor extractor;  
  21.     Mat descriptors1, descriptors2;  
  22.     extractor.compute(srcImage1, keyPoint1, descriptors1);  
  23.     extractor.compute(srcImage2, keyPoints2, descriptors2);  
  24.   
  25.     //【5】使用BruteForce进行匹配  
  26.     // 实例化一个匹配器  
  27.     BruteForceMatcher< L2<float> > matcher;  
  28.     std::vector< DMatch > matches;  
  29.     //匹配两幅图中的描述子(descriptors)  
  30.     matcher.match(descriptors1, descriptors2, matches);  
  31.   
  32.     //【6】绘制从两个图像中匹配出的关键点  
  33.     Mat imgMatches;  
  34.     drawMatches(srcImage1, keyPoint1, srcImage2, keyPoints2, matches, imgMatches);//进行绘制  
  35.   
  36.     //【7】显示效果图  
  37.     imshow("匹配图", imgMatches);  

你可能感兴趣的:(应用——OpenCV)