如何提高检测物体的距离?

时间:2016-02-12 08:59:58

标签: opencv opencv3.0 object-detection

我正在开发一个项目,该项目应该过滤图像中的红色对象,并使用两个网络摄像头计算到该对象的距离。

要检测对象,我将图像从BGR转换为HSV,并使用函数inRange来限制它们。

然后我使用findContours来获取图像中的轮廓,这应该是红色对象的轮廓。

作为最后一步,我使用boundingRect来获取一个Rect的Vector,每个检测到的对象包含一个Rect。

下面的两张图片显示了我的问题。粉红色矩形的一个距离相机约162厘米,另一个约175厘米。如果对象超过170厘米,则无法识别对象,尽管阈值图像显示对象的轮廓。

>170cm

<170cm

有没有办法改善检测物体的距离?

的main.cpp

ObjectDetection obj;
StereoVision sv;
for (;;) {
    cp.read(imgl);
    cp2.read(imgr);

    sv.calculateDisparity(imgl, imgr, dispfull, disp8, imgToDisplay);
    Mat imgrt, imglt;
    obj.filterColor(imgl, imgr, imglt, imgrt);


        //p1 und p2 sind die gefundenen Konturen eines Bildes
        vector<vector<Point> > p1 = obj.getPointOfObject(imglt);
        vector<Rect> allRoisOfObjects = obj.getAllRectangles(imgl, p1);
        for(int i = 0; i < allRoisOfObjects.size(); i++){
            Rect pos = allRoisOfObjects.at(i);
            pos.width -= 20;
            pos.height -= 20;
            pos.x += 10;
            pos.y += 10;
            disp = dispfull(pos);

            float distance = sv.calculateAverageDistance(pos.tl(),pos.br(),dispfull);

            stringstream ss;
            ss << distance;
            rectangle(imgToDisplay, allRoisOfObjects.at(i), color, 2,8, 0);
            putText(imgToDisplay, ss.str(), pos.br(), 1, 1, color, 1);
            ss.clear();
            ss.str("");
            newObjects.push_back(pos);
        }
}

ObjectDetection.cpp

void ObjectDetection::filterColor(Mat& img1, Mat& img2, Mat& output1,
    Mat& output2) {
   Mat imgHSV, imgHSV2;
   cvtColor(img1, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV
   cvtColor(img2, imgHSV2, COLOR_BGR2HSV);
   Mat imgThresholded, imgThresholded2;

   inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV),
        imgThresholded);
   inRange(imgHSV2, Scalar(iLowH, iLowS, iLowV),
        Scalar(iHighH, iHighS, iHighV), imgThresholded2);
   output1 = imgThresholded;
   output2 = imgThresholded2;

}

vector<vector<Point> > ObjectDetection::getPointOfObject(Mat img) {
   vector<vector<Point> > contours;
   vector<Vec4i> hierarchy;
   findContours(img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE,
        Point(0, 0));

   return contours;
}

vector<Rect> ObjectDetection::getAllRectangles(Mat & img, vector<vector<Point> > contours){
   vector<vector<Point> > contours_poly(contours.size());
   vector<Rect> boundRect(contours.size());
   vector<Point2f> center(contours.size());
   vector<float> radius(contours.size());
   Rect rrect;
   rrect.height = -1;
   RNG rng(12345);

   for (int i = 0; i < contours.size(); i++) {
        approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true);
        boundRect[i] = boundingRect(Mat(contours_poly[i]));
   }
   return boundRect;
}

0 个答案:

没有答案