2016-11-23 4 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 변수가 해당 매트의 주소를 보유하고 있다는 것을 깨달았다. C++의 지식에 따르면) 코드가 실행되면 더 이상 존재하지 않습니다. (맞습니까?)

그 문제를 해결하기 위해 노력했습니다. 이 큐를 추가하기 전에

Mat m; 
image.copyTo(m); 

큐를 추가했습니다. 그러나 이로 인해 메모리가 누출되었습니다. (자동으로 해제되지 않는 이유는 무엇입니까?) (다시 말하지만 obj-c 정보가 너무 많지 않음)

다음은 마지막 아이디어입니다.이 줄은 큐의 첫 번째 줄에 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); 
      } 
     } 
    }); 

} 

내가 어떤 도움 아니면 아이폰 OS에서 비디오 처리에 대한 튜토리얼 때문에 감사하겠습니다 내가 찾은 모든 것이 다른 환경을 사용하거나 최적화가 필요한 충분한 프로세스 시간을 사용하지 않고 있었던 것입니다.

답변

0

같은 문제가있는 사람들에게 해결책을 찾아 냈습니다. 내 두 번째 시도 방법은 매우 가깝습니다. 모든 프레임을 처리하려고 했으므로 문제를 생각해 보았습니다. 그래서 모든 것을 메모리에 복사 했으므로 프로세싱에 많은 시간이 걸렸습니다. 스택이 채워져 채워졌습니다. 기억. 그래서 제가 한 것은 코드를 수정하여 한 프레임 씩 처리하고 다른 모든 프레임을 건너 뛰는 것입니다 (처리하지 않고 보여줍니다).