我正在开发一个小应用程序,客户可以通过浏览器控制机器人进行学习。实际上客户看不到机器人,因此我通过MJPEG提供网络摄像头直播。
我正在使用OpenCV 2.4.9和Visual C ++。
在网络摄像头流的帧上,我执行了几项操作,如:
我的机器人检测方法存在性能问题。有时检测需要大约20 - 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);
}
}
此代码用于检测框架上矩形和三角形的位置。
有时此方法调用的性能最多需要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的网络摄像头。
你们有没有人看到这个问题?欢迎任何帮助!
非常感谢