2016-11-23 11 views
0

私はiOSプロジェクトに取り組んでいます。私はライブビデオの色付きの円を検出する必要があります。 私はCvVideoCameraDelegateを使用しています。ここに私のコードは次のとおりです。iOS - OpenCVビデオ処理の最適化

-(void)processImage:(cv::Mat &)image{ 
    cv::medianBlur(image, image, 3); 
    Mat hvs; 
    cvtColor(image, hvs, COLOR_BGR2HSV); 
    Mat lower_red; 
    Mat upper_red; 
    inRange(hvs, Scalar(0, 100, 100), Scalar(10, 255, 255), lower_red); 
    inRange(hvs, Scalar(160, 100, 100), Scalar(179, 255, 255), upper_red); 

    Mat red_hue; 
    addWeighted(lower_red, 1, upper_red, 1, 0, red_hue); 
    GaussianBlur(red_hue, red_hue, cv::Size(9,9), 2,2); 


    HoughCircles(red_hue, circles, CV_HOUGH_GRADIENT, 1, red_hue.rows/8,100,20,0,0); 
    if(circles.size() != 0){ 
     for(cv::String::size_type current = 0;current<circles.size();++current){ 
      cv::Point center(std::round(circles[current][0]),std::round(circles[current][1])); 
      int radius = std::round(circles[current][2]); 
      cv::circle(image, center, radius, cv::Scalar(0, 255, 0), 5); 
     } 
    } 
} 

それが正常に動作しますが、多くの時間がかかり、映像が少しラグです。 私のコードを他の待ち行列に入れたいのですが、EXC_BAD_ACCESSがこの行にあります。cv::medianBlur(image, image, 3);

このプロジェクトではobjective-cを使い始めましたので、何が起こっているのかを理解するのは少し難しいですが、image変数がMatのアドレスを保持していることがわかりました。 C + +の知識は言う)私はそれがもはや存在しないコードを実行するポイントになるとき。 (私はそうですか?)

私はその問題を回避しようとしました。私はこれを追加しました

Mat m; 
image.copyTo(m); 

私のキューの前に。しかし、これはメモリリークを引き起こしました。 (なぜ、自動的に解放されないのですか?)また、キューの最初の行にMat m = image;という行を追加しました。マットは:: 品種の中からEXC_BAD_ACCESを得て開始し、それはまだここに遅れた私のコードは、今どのように見えるかです:。

-(void)processImage:(cv::Mat &)image{ 
    //First attempt 
    //Mat m; 
    //image.copyTo(m); 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     Mat m = image; // second one 
     cv::medianBlur(m, m, 3); 
     Mat hvs; 
     cvtColor(m, hvs, COLOR_BGR2HSV); 
     Mat lower_red; 
     Mat upper_red; 
     inRange(hvs, Scalar(0, 100, 100), Scalar(10, 255, 255), lower_red); 
     inRange(hvs, Scalar(160, 100, 100), Scalar(179, 255, 255), upper_red); 

     Mat red_hue; 
     addWeighted(lower_red, 1, upper_red, 1, 0, red_hue); 
     GaussianBlur(red_hue, red_hue, cv::Size(9,9), 2,2); 


     HoughCircles(red_hue, circles, CV_HOUGH_GRADIENT, 1, red_hue.rows/8,100,20,0,0); 
     if(circles.size() != 0){ 
      for(cv::String::size_type current = 0;current<circles.size();++current){ 
       cv::Point center(std::round(circles[current][0]),std::round(circles[current][1])); 
       int radius = std::round(circles[current][2]); 
       cv::circle(m, center, radius, cv::Scalar(0, 255, 0), 5); 
      } 
     } 
    }); 

} 

私はので、iOSの中に任意のヘルプまたは多分ビデオ処理に関するチュートリアルをいただければ幸いです私が見つけたものは他の環境を使用していたか、最適化が必要な処理時間が足りませんでした。

答えて

0

同じ問題を抱える人にとって、私は解決策を見つけ出すことができました。私の2番目の試みの方法は非常に近く、問題は(私は思う)私はすべてのフレームを処理しようとしたので、私はそれらをメモリにコピーしました。処理には多くの時間がかかりました。想い出。だから私がしたことは、コードを修正して1つのフレームを1回処理し、他のすべてをスキップ(処理なしで表示)するようにしたことでした。

関連する問題