Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV性能不佳(对象检测)_C++_Opencv_Visual C++ - Fatal编程技术网

C++ OpenCV性能不佳(对象检测)

C++ OpenCV性能不佳(对象检测),c++,opencv,visual-c++,C++,Opencv,Visual C++,我正在开发一个小应用程序,客户可以通过他们的浏览器控制机器人进行学习。实际上,客户看不到机器人,因此我通过MJPEG提供了一个网络摄像头直播流 我使用OpenCV 2.4.9和Visual C++。 在网络摄像头流的帧上,我执行以下操作: 用一些透明图像覆盖框架 探测机器人 ... 我的性能问题出现在机器人的检测方法上。有时检测需要约20-30毫秒,有时高达30毫秒!900毫秒。我不知道为什么会有这么大的性能差异 一些细节 使用的形状: 对于检测,我使用两种不同的形状,如您在此处所见: 一个机

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

我使用OpenCV 2.4.9和Visual C++。 在网络摄像头流的帧上,我执行以下操作:

用一些透明图像覆盖框架 探测机器人 ... 我的性能问题出现在机器人的检测方法上。有时检测需要约20-30毫秒,有时高达30毫秒!900毫秒。我不知道为什么会有这么大的性能差异

一些细节 使用的形状:

对于检测,我使用两种不同的形状,如您在此处所见:

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

守则:

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

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);
    }
}
第三条线路也是最长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帧的网络摄像头

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


如果你能预料到三角形的位置,非常感谢;每个帧只执行一次,然后您可以在它之后中断以提前停止循环。我尝试了此操作,但结果是,由于OpenCV检测到多个三角形,所以机器人并不总是被检测到:/
int threshdetect2 = 100;
int max_threshdetect2 = 255;
Canny(src_graydetect2, canny_output, threshdetect2, threshdetect2 * 2, 3);