JavaCV findContours обводить изображение вместо нахождения контура
Я пытаюсь выяснить, есть ли в моей области интереса какой-либо прямоугольник / квадрат. Вот чего я достиг до сих пор.
Ниже представлена область интереса, которую я вырезал из исходного изображения с помощью 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;
}
Сейчас я пытаюсь выяснить, присутствует ли какой-либо прямоугольник в интересующей области. Я использовал следующие строки кода, чтобы обнаружить это также.
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);
}
}
Но вместо того, чтобы найти квадрат внутри изображения, он выделяет части изображения следующим образом.
Было бы здорово, если бы кто-то подтолкнул меня в правильном направлении.
1 ответ
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 в центре.