【问题标题】:Detecting rectangle in image gives unwanted result (opencv, java)检测图像中的矩形会产生不需要的结果(opencv,java)
【发布时间】:2014-04-22 21:48:07
【问题描述】:

我有这张图片,我已经对其进行了阈值处理以将其转换为二进制图像和黑白图像。见下图:

我想提取每个带有字母的框,这是通过以下代码完成的:

 List<MatOfPoint> contours = new ArrayList<MatOfPoint>();  
  Imgproc.findContours(destination3, contours, new Mat(), Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);

         MatOfPoint2f approxCurve = new MatOfPoint2f();
         int x = 1;
         //For each contour found
         for (int i=0; i<contours.size(); i++)
         {
             //Convert contours(i) from MatOfPoint to MatOfPoint2f
             MatOfPoint2f contour2f = new MatOfPoint2f( contours.get(i).toArray() );
             //Processing on mMOP2f1 which is in type MatOfPoint2f
             double approxDistance = Imgproc.arcLength(contour2f, true)*0.02;
             Imgproc.approxPolyDP(contour2f, approxCurve, approxDistance, true);

             //Convert back to MatOfPoint
             MatOfPoint points = new MatOfPoint( approxCurve.toArray() );

             // Get bounding rect of contour
             Rect rect = Imgproc.boundingRect(points);
             if(rect.height > 50 && rect.height < 100) {
              // draw enclosing rectangle (all same color, but you could use variable i to make them unique)
             //Core.rectangle(destination, new Point(rect.x,rect.y), new Point(rect.x+rect.width,rect.y+rect.height), new Scalar(255, 0, 255), 3); 
             Rect roi = new Rect(rect.x, rect.y, rect.width, rect.height);
             Mat cropped = new Mat(destination3, roi);
             Highgui.imwrite("letter"+x+".jpg", cropped);
             x++;
             }
         }

但是提取出来的字母是全黑的,看起来就像填充了白色字母一样,如下图所示。我该如何解决?我的代码有什么问题?

【问题讨论】:

标签: java opencv image-processing


【解决方案1】:

来自findContours()的文档:(强调我的)

注意:源图像被此函数修改。另外,该函数不考虑图像的1像素边界(它用0填充,用于算法中的邻居分析) ,因此与图像边框接触的轮廓将被剪裁。

您看到的奇怪图像是findContours()destination3 进行修改的结果。您应该能够通过调用clone() 将数据的深层副本传递给findContours() 来获得正确的结果。您调用 findContours() 的那一行将如下所示:

Imgproc.findContours(destination3.clone(), contours, new Mat(), Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);
                             //   ^^ Vive la difference!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2014-04-30
    • 2013-03-23
    • 2021-07-03
    • 2019-11-29
    • 2012-05-21
    • 2016-03-18
    相关资源
    最近更新 更多