检测玩具车后面使用opencv在android

时间:2016-06-16 08:47:17

标签: java android c++ opencv image-processing

我有一个跟踪玩具车在java中使用opencv的项目,但我不知道如何检测并为后面的车创建一个矩形。以下是我的所有想法和方式,但它仍然没有发现好。

我的源图片: enter image description here

我的目标是在车后检测。像这样的东西(我使用Paint绘制:))

enter image description here

我的想法是:

_将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);

我的图片看起来像那样

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);

 }

value1,value7,value8,value9,value10是角度,高度min,高度max,宽度min,宽度max的值,我限制汽车矩形的大小。我用轨迹栏来调整它。 结果并不好,我试图调整值1,7,8,9,10是最好的。它仍然有一些噪音:(

enter image description here

enter image description here

enter image description here

所以现在,我想问的问题是,这是检测玩具车背后的正确方法???,如果不是,是否有其他方法可以做到这一点。或者我错过了什么,有些步骤???我怎样才能确切地在车后面检测到高度,矩形的宽度最稳定???

每个答案都表示赞赏,非常感谢你们

1 个答案:

答案 0 :(得分:2)

我做过类似的事情......这需要付出一些努力,但对你的要求非常满意。事情是你可以用haar分类器或级联分类器来实现这一点。但要使用它进行检测,您需要一个XML文件,其中包含应识别的图像数据。 Opencv默认提供一些分类器xml,比如检测面部,眼睛,嘴巴,车牌等等。但不幸的是OpenCv没有提供和xml来检测汽车的后视图,因此一种方法是创建自己的分类器xml for您的要求并进行与对象识别(如人脸识别)相似的编码。不要忘记使用自定义的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