为啥 java 和 c++ 中 opencv 的 HoughLines 结果不同

Posted

技术标签:

【中文标题】为啥 java 和 c++ 中 opencv 的 HoughLines 结果不同【英文标题】:Why different result of HoughLines of opencv in java and c++为什么 java 和 c++ 中 opencv 的 HoughLines 结果不同 【发布时间】:2017-04-29 10:19:58 【问题描述】:

我是 OpenCV 新手,正在阅读名为 OpenCV 3.0 Computer Vision 的书 来自 Daniel Lélis Baggio 的 Java。我测试了来自 opencv 站点的图像,该图像试图检测线条,但我得到了不同的结果,只用 Daniel Lélis Baggio java 代码检测了一个线条。我不知道为什么这段代码不能正常工作。书中的代码:

else if(houghString.equals(operation))
        Mat canny = new Mat();
        Imgproc.Canny(originalImage, canny,10 , 50, aperture, false);
        image = originalImage.clone();
        Mat lines = new Mat();

        Imgproc.HoughLines(canny, lines, 1, Math.PI/180, lowThreshold);

        for( int i = 0; i < lines.cols(); i++ )
        
          double rho = lines.get(0, i)[0];
          double theta = lines.get(0, i)[1];
          Point pt1 = new Point(), pt2= new Point();
          double a = Math.cos(theta), b = Math.sin(theta);
          double x0 = a*rho, y0 = b*rho;
          pt1.x = Math.round(x0 + 1000*(-b));
          pt1.y = Math.round(y0 + 1000*(a));
          pt2.x = Math.round(x0 - 1000*(-b));
          pt2.y = Math.round(y0 - 1000*(a));
          Imgproc.line( image, pt1, pt2, new Scalar(255,0,0), 2, Core.LINE_AA,0);
           
    
else if(pHoughString.equals(operation))
        Mat canny = new Mat();
        Imgproc.Canny(originalImage, canny,10 , 50, aperture, false);
        //canny = originalImage.clone();
        image = originalImage.clone();

        //Imgproc.cvtColor(image, image, Imgproc.COLOR_GRAY2BGR);

    Mat lines = new Mat();

    Imgproc.HoughLinesP(canny, lines, 1, 360,  lowThreshold, 50, 5 );
    for( int i = 0; i < lines.cols(); i++ )
    
        double a = lines.get(0, i)[0];
        double b = lines.get(0, i)[1];
        double c = lines.get(0, i)[2];
        double d = lines.get(0, i)[3];
        Imgproc.line( image, new Point(a, b), new Point(c, d), new Scalar(0,0,255), 1, Core.LINE_AA,0);

    

来自opencv网站的c++代码如下:

Mat dst, cdst;
 Canny(src, dst, 50, 200, 3);
 cvtColor(dst, cdst, CV_GRAY2BGR);

 #if 0
  vector<Vec2f> lines;
  HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 );

  for( size_t i = 0; i < lines.size(); i++ )
  
 float rho = lines[i][0], theta = lines[i][1];
 Point pt1, pt2;
 double a = cos(theta), b = sin(theta);
 double x0 = a*rho, y0 = b*rho;
 pt1.x = cvRound(x0 + 1000*(-b));
 pt1.y = cvRound(y0 + 1000*(a));
 pt2.x = cvRound(x0 - 1000*(-b));
 pt2.y = cvRound(y0 - 1000*(a));
 line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA);
  
 #else
  vector<Vec4i> lines;
  HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );
  for( size_t i = 0; i < lines.size(); i++ )
  
  Vec4i l = lines[i];
line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA);
  
 #endif

Java 代码的结果:

以及来自 opencv 站点的结果:

为什么使用 java 和 c++ 的图像会产生不同的结果?

【问题讨论】:

我没有使用 OpenCV 的经验。 AFAICS,您将可能不同的参数传递给函数,例如lowThreshold vs 50 或在最后一行new Scalar(0,0,255), 1, vs Scalar(0,0,255), 3, 【参考方案1】:

已经很晚了,但我刚刚遇到了同样的情况,它可能会对其他一些人有所帮助......

行是在行而不是列中返回的,所以正确的循环应该是:

for( int i = 0; i < lines.rows(); i++ ) 
      double rho = lines.get(i, 0)[0];
      double theta = lines.get(i, 0)[1];
      ...

【讨论】:

以上是关于为啥 java 和 c++ 中 opencv 的 HoughLines 结果不同的主要内容,如果未能解决你的问题,请参考以下文章

为啥 OpenCV 的 MSER 的 Python 实现和 Java 实现会产生不同的输出?

将 MatofKeypoint 从 Java 传递到 c++ 作为 vector<Keypoint> - opencv

Java 与 C++ 中 OpenCV 的实时性能

用OpenCV开发人脸识别软件,用Java好还是用C/C++好

opencv想到的

为啥我在 opencv 3.0 beta 中找不到 balanceWhite?