在 android 中检测玩具车使用 opencv

Posted

技术标签:

【中文标题】在 android 中检测玩具车使用 opencv【英文标题】:Detect behind toy car use opencv in android 【发布时间】:2016-10-17 16:14:59 【问题描述】:

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

我的源图片:

我的目标是检测车后。像这样的东西(我用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 是角度、最小高度、最大高度、最小宽度、最大宽度的值,我限制汽车矩形的大小。我使用轨迹栏来调整它。 虽然我尝试调整 value1、7、8、9、10 是最好的,但结果并不好。它仍然有一些噪音:(

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

感谢您的每一个回答,非常感谢您

【问题讨论】:

【参考方案1】:

我已经做了类似的事情。这将需要一些努力,但对于您的要求来说很少。问题是您可以使用 haar 分类器或级联分类器来实现这一点。但要使用它进行检测,您需要一个 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

【讨论】:

谢谢你的回答,因为我需要一个稳定的矩形作为对象,所以你的方法是找到检测对象并获得宽度和高度稳定的矩形???,还有一个问题是物体的阴影,有阴影的物体可以吗?无论如何,非常感谢您的帮助 阴影效果会自动处理。您必须注意的一件事是使用 haar 分类器找到这些特征,但是您将给出要在对象周围绘制的矩形的尺寸。所以你手动给矩形的高度和宽度。 好的,非常感谢你,也许我会按照你的方式进行,我对“Haar 特征的级联分类器”这个方法一无所知。它看起来像模板匹配。但我会再次研究它,非常感谢你:)

以上是关于在 android 中检测玩具车使用 opencv的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV,Android:从图像中检测对象而不是实时检测

如何在 android 中提高 OpenCV 人脸检测性能?

使用 OpenCV Android 进行面部特征检测

使用OpenCV Android SDK从摄像头帧实时检测人脸

通过 Android 眼睛检测和 OpenCV 跟踪在 android 中睁眼和闭眼

在为人脸检测运行 OpenCV 示例时使用带有 Android 模拟器的网络摄像头