JavaCV findContours обводить изображение вместо нахождения контура - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь выяснить, есть ли в моей области интереса какой-либо прямоугольник / квадрат.Вот то, чего я достиг до сих пор.

Ниже представлена ​​область интереса, которую я вырезал из исходного изображения с помощью 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 голосов
/ 30 мая 2018

OpenCV 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 (они все> 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 блок в центре.

...