我正在尝试在 iPhone(视频流)上使用 OpenCV 检测具有 6 个角的形状。我得到了相当不错的结果,但是以大约 8 fps 的低帧速率为代价(取决于检测轮廓)遵循一些代码片段和相应的帧速率(如果我在此调用后中断)和一些时间测量使用OpenCV getTickCount() 和 getTickFrequenzy();
clock_t now;
clock_t then;
double tickpersecond = cv::getTickFrequency();
double elapsed_seconds;
// around 24 fps
then = cv::getTickCount();
GaussianBlur( gray, gray, cv::Size(9, 9), 2, 2 ); // 20fps
Canny( gray, gray, m_threshold, m_threshold * 2,3 ); // 13fps
now = cv::getTickCount();
elapsed_seconds = (double)(now - then) / tickpersecond;
// elapsed_seconds is around 0.068183 seconds
//assuming we there are around 120 contours found
cv::findContours( gray, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_TC89_L1, cv::Point(0,0) );
// 10 fps and elapsed_time around 0.008560 seconds
我不确定是否有什么可以加快的速度,但我觉得有点奇怪的是,当我运行 findContours 时有 3fps 的下降,但 elapsed_time 非常低,为 0.008560。然而,最大的部分是以下代码片段:
for( int i = 0; i< contours.size(); i++ )
{
cv::Scalar color = cv::Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
std::vector<cv::Point> output;
approxPolyDP( contours[i], output, 0.01*arcLength(contours[i],true), true );
convexHull( output, convexContour );
if(convecContour.size() == 6)
//dosomething which I think is not performance relevant
}
//8 fps and elapsed_time == 0.018076
我正在处理从 10 到 150 的 contours.size()。我真的希望你们能指出一些我可以将性能提高到恒定帧速率 15 的事情。