2016-06-16 5 views
2

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

Мой источник изображения: enter image description here

И моя цель обнаружить позади автомобиля. Некоторые вещи, как это (я использую Paint нарисовать :))

enter image description here

Моя идея:

_Convert RGB изображение серого изображения. Используйте Осторожные обнаружения, чтобы найти края и использовать 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); 

Мой образ будет выглядеть

enter image description here

_ Тогда я буду использовать 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); 
     . 
     . 
     . 

Мой образ будет как то: enter image description here

И, наконец, я не буду рисовать контур, и я использую 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); 

} 

значение1, value7, ценности8, value9, value10 это значение угла, высота мин, высота, ширина макс мин, ширина которого я макс ограничить размер для прямоугольника автомобиля. Я использую trackbar для его настройки. И результат не хорош, хотя я пытался настроить значение1,7,8,9,10. И еще есть некоторый шум :(

enter image description here

enter image description here

enter image description here

Итак, мой вопрос, что я хотел бы спросить, это правильный путь, чтобы обнаружить за игрушечный автомобиль Если нет, есть ли у меня другой способ сделать это. Или я что-то пропустил, какой-то шаг? Как я могу точно отрегулировать машину, чтобы получить высоту, ширина прямоугольника самая стабильная?

Каждый ответ приветствуется и так много спасибо

ответ

2

Я сделал что-то похожее на это .. Это потребует некоторых усилий, но достаточно для вашего требования. Дело в том, что вы можете достичь этого с помощью классификатора хара или каскадного классификатора. Но для обнаружения с ним вам нужен XML-файл, который содержит данные изображения, которое он должен распознать. Opencv предоставляет некоторый классификатор xml по умолчанию, как для обнаружения лиц, глаз, рта, номерных знаков и т. Д. Но, к сожалению, OpenCv не предоставляет и xml для обнаружения заднего вида автомобиля, поэтому один из подходов - создать свой собственный классификатор xml для ваше требование и выполните аналогичное кодирование, как и для распознавания объектов, например распознавание лиц. Не забудьте изменить классификатор лица xml с помощью сделанного вами xml-файла.

Сначала прочитайте эту

http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html

Проверить эту ссылку на шаг за шагом процесс

http://www.tectute.com/2011/06/opencv-haartraining.html?m=1

+0

Спасибо за ваш ответ, потому что я нужен стабильный прямоугольник для объекта, поэтому являются Вашими способ найти для обнаружения объекта и получить прямоугольник с шириной и высотой стабильной ???, и там одна проблема - тень объекта, хорошо ли это с объектом, который имеет тень. Независимо от того, спасибо вам большое за вашу помощь. – Bruce

+0

Эффект тени автоматически позаботится. Одна вещь, которую вы должны отметить, что функции обнаруживаются с помощью хара-классификатора, но вы тот, который будет давать размеры прямоугольника, который будет нарисован вокруг объекта. Поэтому вы вручную указываете высоту и ширину прямоугольника. –

+0

Хорошо, так много спасибо вам и, может быть, я перейду к вашему пути, я ничего не знаю об этом методе «каскадный классификатор для функций Haar». Кажется, это похоже на сопоставление шаблонов. но я буду исследовать его, еще раз, большое вам спасибо :) – Bruce

Смежные вопросы