OpenCV:加速在iPhone上检测简单形状

时间:2013-05-02 16:38:10

标签: c++ iphone performance opencv

我正在尝试使用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但有一个相当低的elapsed_time为0.008560时,有3fps的下降。但最重要的部分是以下代码段:

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帧的恒定帧率的事情。

1 个答案:

答案 0 :(得分:0)

问题是这些标志:CV_RETR_TREE,CV_CHAIN_APPROX_TC89_L1

尝试使用:CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE

您使用的flags正在尝试查找嵌套轮廓的完整层次结构。