OpenCV性能不佳(对象检测)

时间:2015-01-24 18:25:14

标签: c++ opencv visual-c++

我正在开发一个小应用程序,客户可以通过浏览器控制机器人进行学习。实际上客户看不到机器人,因此我通过MJPEG提供网络摄像头直播。

我正在使用OpenCV 2.4.9和Visual C ++。

在网络摄像头流的帧上,我执行了几项操作,如:

  • 用一些透明图像覆盖框架
  • 检测机器人
  • ...

我的机器人检测方法存在性能问题。有时检测需要大约20 - 30毫秒,有时高达(!)900毫秒。我不知道为什么会有这么大的性能差异。

一些细节

使用过的形状:

对于检测,我使用两种不同的形状,如下所示: Robot shapes

一个机器人有一个黑色圆圈,里面有一个白色三角形,另一个机器人有一个带有三角形的矩形 - 两个都有黑色边框和白色填充。

代码:

我已经发现这些代码行是性能损失的主要来源:

vector<vector<Point> > contours;

findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);

for (size_t i = 0; i < contours.size(); i++)
{
    cv::approxPolyDP(cv::Mat(contours[i]), approx, cv::arcLength(cv::Mat(contours[i]), true)*0.1, true);

    // Skip small or non-convex objects
    if (std::fabs(cv::contourArea(contours[i])) < 100 || !cv::isContourConvex(approx))
        continue;

    if (approx.size() == 3)
    {
        triangles.push_back(approx);
        trianglePositions.push_back(i);
    }
}

此代码用于检测框架上矩形和三角形的位置。

有时此方法调用的性能最多需要130毫秒:

Mat srcdetect2; //the original webcam frame
Mat src_graydetect2;
cvtColor(srcdetect2, src_graydetect2, COLOR_BGR2GRAY);

第三行是这一行(也是最多100毫秒):

blur(src_graydetect2, src_graydetect2, Size(3, 3));

我想到的最后一行是:

int threshdetect2 = 100;
int max_threshdetect2 = 255;
Canny(src_graydetect2, canny_output, threshdetect2, threshdetect2 * 2, 3);

我现在坐在这段代码前几个小时,我不知道为什么我会失去这里的表现。

此代码由具有不同网络摄像头帧的多个线程调用,以提高吞吐量。我使用15 FPS的网络摄像头。

你们有没有人看到这个问题?欢迎任何帮助!

非常感谢

0 个答案:

没有答案