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