У меня есть проект для отслеживания использования игрушечной машины OpenCV в Java, но я не знаю, как обнаружить и создать прямоугольник для машины позади. Ниже приведены все мои идеи и способы, которыми я занимаюсь, но это все равно не обнаруживает добра.
И моя цель — обнаружить за машиной. Примерно так (я использую Paint для рисования :))
Моя идея такова:
_ Преобразуйте изображение RGB в серое изображение. Используйте обнаружение Canny, чтобы найти край, и используйте GaussianBlur, чтобы сделать изображение более плавным
Imgproc.cvtColor(mImageRGBA, thresholded, Imgproc.COLOR_RGB2GRAY,3);
Imgproc.Canny(thresholded, thresholded, 78, 212);
Imgproc.GaussianBlur(thresholded, thresholded, new Size(5, 5), 2.2, 2);
Мой образ будет выглядеть так
_ Затем я использую findcontour, чтобы найти контур автомобиля и нарисовать его.
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat mHierarchy = new Mat();
Imgproc.findContours(thresholded, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
for( int i = 0; i< contours.size(); i++ ) {
circle_contour = contours.get(i).toArray();
double contour_length = circle_contour.length;
if (contour_length < 50) continue;
Imgproc.drawContours(thresholded,contours,i,new Scalar(255,255,255),2);
.
.
.
И, наконец, я не буду рисовать контур, и я использую minAreaRec, чтобы найти прямоугольник, который имеет подходящий размер. Я сделаю этот прямоугольник.
//Imgproc.drawContours(thresholded,contours,i,new Scalar(255,255,255),2);// remove this line and continue to find rectangle for car.
.
.
.
Car_Rect = Imgproc.minAreaRect(new MatOfPoint2f(contours.get(i).toArray()));
float rect_width = Car_Rect.boundingRect().width;
float rect_height = Car_Rect.boundingRect().height;
float rect_ratio = rect_width/rect_height;
Point points[] = new Point[4];
Car_Rect.points(points);
if((Car_Rect.angle<=value1)&&(rect_width>value7)&&(rect_width<value8)&&(rect_height>value9)&&(rect_height<value10))
{
Imgproc.line(thresholded,points[0],points[1],new Scalar(255, 255, 255),2);
Imgproc.line(thresholded,points[1],points[2],new Scalar(255,255,255),2);
Imgproc.line(thresholded,points[2],points[3],new Scalar(255,255,255),2);
Imgproc.line(thresholded,points[3],points[0],new Scalar(255,255,255),2);
}
value1, value7, value8, value9, value10 — это значение угла, высота min, высота max, ширина min, ширина max, которые я ограничиваю для прямоугольника автомобиля. Я использую трекбар, чтобы настроить его.
И результат не очень хороший, хотя я пытался откорректировать значение 1,7,8,9,10 лучше. И это все еще есть некоторый шум 🙁
Итак, теперь мой вопрос, который я хотел бы задать, заключается в том, является ли это правильным способом обнаружения позади игрушечной машины ???, если нет, есть ли другой способ сделать это. Или я что-то пропустил, какой-то шаг ??? Как я могу определить точно позади автомобиля, чтобы получить высоту, ширина прямоугольника наиболее стабильным ???
Каждый ответ приветствуется и огромное спасибо
Я сделал что-то похожее на это .. Это потребует некоторых усилий, но довольно горстка для вашего требования. Дело в том, что вы можете достичь этого с помощью классификатора Хаара или каскадного классификатора. Но чтобы обнаружить его, вам нужен файл XML, содержащий данные изображения, которое он должен распознать. По умолчанию Opencv предоставляет некоторый классификатор xml, например, для определения лица, глаз, рта, номерных знаков и т. Д. Но, к сожалению, OpenCv не предоставляет и xml для определения заднего вида автомобиля, поэтому один из подходов заключается в создании собственного классификатора xml для ваше требование и выполните аналогичное кодирование, как вы делаете для распознавания объектов, таких как распознавание лиц. Не забудьте поменять xml классификатора лица на ваш файл xml.
Сначала прочитайте это
http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html
Проверьте эту ссылку для пошагового процесса
Других решений пока нет …