Как определить квадрат или прямоугольник с переменной длиной и шириной с помощью javacv?

Я разрабатываю проект, использующий java для идентификации компонентов, используя пакет opencv, но я новичок в javacv, и я просто хочу знать, как идентифицировать прямоугольники в конкретном исходном изображении, пожалуйста, можете ли некоторые опытные люди дать некоторые основные рекомендации для архивирования этой задачи. Я пытаюсь использовать сопоставление с шаблоном здесь, но он может идентифицировать только прямоугольник точного размера. Но в моем случае мне нужно определить прямоугольник переменной длины?

import java.util.Arrays;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
public class TestingTemplate {
public static void main(String[] args) {
//Original Image
IplImage src = cvLoadImage("src\\lena.jpg",0);
//Template Image
IplImage tmp = cvLoadImage("src\\those_eyes.jpg",0);
//The Correlation Image Result
IplImage result = cvCreateImage(cvSize(src.width()-tmp.width()+1, src.height()-tmp.height()+1), IPL_DEPTH_32F, 1);
//Init our new Image
cvZero(result);
cvMatchTemplate(src, tmp, result, CV_TM_CCORR_NORMED);

double[] min_val = new double[2];
double[] max_val = new double[2];

//Where are located our max and min correlation points
CvPoint minLoc = new CvPoint();
CvPoint maxLoc = new CvPoint();
cvMinMaxLoc(result, min_val, max_val, minLoc, maxLoc, null); //the las null it's for
 optional mask mat()

System.out.println(Arrays.toString(min_val)); //Min Score
System.out.println(Arrays.toString(max_val)); //Max Score

CvPoint point = new CvPoint();
point.x(maxLoc.x()+tmp.width());
point.y(maxLoc.y()+tmp.height());
cvRectangle(src, maxLoc, point, CvScalar.WHITE, 2, 8, 0); //Draw the rectangule result in original img.
cvShowImage("Lena Image", src);
cvWaitKey(0);
//Release
cvReleaseImage(src);
cvReleaseImage(tmp);
cvReleaseImage(result);
}
}

Пожалуйста, может кто-нибудь помочь достичь этого

 Abid Rahman K19 июн. 2012 г., 08:26
Это сквайр или квадрат? если нет, то что такое оруженосец? Гугл говорит, что это доспехи солдат. Это то, что вы хотите? Лучше добавить изображение.
 user146519519 июн. 2012 г., 05:18
Дэйв: Не могли бы вы предоставить какую-нибудь строку гильдии для архивации этого & gt;
 Dave Newton19 июн. 2012 г., 04:50
Квадраты? Сквайры сложнее.
 user146519519 июн. 2012 г., 13:50
О, я просто вижу эту ошибку, мне действительно нужно идентифицировать прямоугольники и квадраты на изображении. действительно очень сожалею об ошибке, которую я сделал. Теперь я исправил вопрос.

Ответы на вопрос(1)

Решение Вопроса

(Так что это зафиксировано как квадрат.)

Для обнаружения квадратов, OpenCV поставляется с некоторыми образцами для этого. Коды в C ++, C, Python. Надеюсь, вы можете перенести это на JavaCV.

Код C ++ , Код Python.

Я просто проиллюстрирую, как это работает:

1 - сначала тыsplit the image в самолеты R, G, B.

2 - Затем для каждого самолета выполнитьedge detectionи в дополнение к этому,threshold для разных значений, таких как 50, 100, .... и т. д.

3 - И во всех этих двоичных изображенияхfind contours (помните, что он обрабатывает много изображений, поэтому может быть немного медленным, если вы не хотите, вы можете удалить некоторые пороговые значения).

4 - После обнаружения контуров удалите небольшие нежелательные шумыfiltering according to area.

5 - Тогдаapproximate the contour. (Подробнее о приближении контура).

6 - Для прямоугольника, он даст вам четыре угла. Для других будут предоставлены соответствующие углы.

Поэтому отфильтруйте эти контуры по количеству элементов в приближенном контуре, которое должно быть четыре, что равно количеству углов.First property of rectangle.

7 - Далее могут быть фигуры с четырьмя углами, но не прямоугольниками. Итак, мы беремsecond property of rectangles, ie all inner angles are 90, Таким образом, мы находим угол во всех углах, используя соотношение ниже:

enter image description here

И если cos (тета) & lt; 0,1, то есть тета & gt; 84 градуса, это прямоугольник.

8 - Тогда как насчет площади?Use its property, that all the sides are equal.

Вы можете найти расстояние между двумя точками по соотношению, как показано выше. Проверьте, все ли они равны, тогда этот прямоугольник является квадратом.

Вот как работает код.

Ниже приведен вывод, который я применил вышеупомянутый код на изображении:

enter image description here

EDIT :

Был задан вопрос, как удалить прямоугольник, обнаруженный на границе. Это потому, что opencv находит белые объекты на черном фоне, как и границы. Простое обращение изображения с помощью функции cv2.bitwise_not () решит проблему. мы получаем результат, как показано ниже:

enter image description here

Вы можете найти больше информации о контуре здесь:Контуры - 1: Начало работы

 21 июн. 2012 г., 03:29
Так могу ли я получить каждый прямоугольник отдельно? Если это возможно, вы можете предоставить пример кода для него.
 20 июн. 2012 г., 14:41
Эта большая граница прямоугольника обнаружена, потому что контуры opencv находят белые объекты на черном фоне. Так что сделайте квадраты белыми, т.е. просто переверните изображение. Я обновил ответ.
 20 мая 2013 г., 16:50
@Youngjae: изменил ссылки .. попробуйте ..
 20 июн. 2012 г., 14:01
Не могли бы вы объяснить, как я могу получить прямоугольники с шириной меньше определенной? на самом деле мне нужно убрать те большие прямоугольники, которые показаны на изображении (бордюры).
 06 июл. 2012 г., 06:55
Скажите, пожалуйста, как можно определить квадраты, используя приведенный выше код? Потому что это дало и все прямоугольники, пожалуйста, вы можете это объяснить?

Ваш ответ на вопрос