JavaCV findContours概述图像而不是找到轮廓

时间:2018-05-30 06:53:16

标签: opencv image-processing javacv

我试图找到我感兴趣的区域内是否存在任何矩形/正方形。这是我到目前为止所取得的成就。

以下是我使用JavaCV从原始图像中剪切出的感兴趣区域。

        Mat areaOfInterest = OpenCVUtils.getRegionOfInterest("image.jpg",295,200,23,25);

 public static Mat getRegionOfInterest(String filePath , int x, int y, int width, int height){

    Mat roi = null;

    try{
        Mat image = Imgcodecs.imread(filePath);
        Rect region_of_interest= new Rect(x,y,width,height);
        roi = image.submat(region_of_interest);

    }catch (Exception ex){

    }
    return roi;
}

Region of interest

现在我试图找出感兴趣的区域中是否存在任何矩形。我已经使用以下代码行来检测它。

    Mat gray = new Mat();
    Mat binary = new Mat();
    Mat hierarchy = new Mat();
    ArrayList<MatOfPoint> contours = new ArrayList<>();
    cvtColor(image,gray,COLOR_BGR2GRAY);
    Core.bitwise_not(gray,binary);
    findContours(binary,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE);
    if(contours.size() > 0){
        for (MatOfPoint contour:contours) {
          Rect rect = boundingRect(contour);
          /// x = 0, y = 1 , w = 2, h =3
          Point p1 = new Point(rect.x,rect.y);
          Point p2 = new Point(rect.width + rect.x, rect.height+rect.y);
          rectangle(image,p1,p2,new Scalar(0,0,255));
          Imgcodecs.imwrite("F:\\rect.png",image);
        }
    }

但是,不是在图像中找到正方形,而是将图像的各个部分概述如下。 enter image description here

如果有人把我推向正确的方向,那就太好了。

1 个答案:

答案 0 :(得分:1)

OpenCV&#39; s findContours()将输入图像视为二进制,其中0的所有内容都是黑色,任何0的像素都是白色。由于您正在阅读jpg图像,因此压缩使得大多数白色像素都不是白色,而大多数黑色像素并非完全黑色。因此,如果您有一个输入图像,如:

3 4 252 250 3 1
3 3 247 250 3 2
3 2 250 250 2 2
4 4 252 250 3 1
3 3 247 250 3 2
3 2 250 250 2 2

然后findContours()将概述整个事情,因为它等同于全部为255(它们全部&gt; 0)。

您需要做的就是使用threshold()inRange()等图像对图像进行二值化,以便实际显示图像

0 0 255 255 0 0
0 0 255 255 0 0
0 0 255 255 0 0
0 0 255 255 0 0
0 0 255 255 0 0
0 0 255 255 0 0

然后你正确地得到了中心255块的轮廓。