OpenCV:后台队列中的视频处理

时间:2016-05-18 04:40:43

标签: ios opencv image-processing video-processing nsoperationqueue

使用强大的OpenCV成功地从视频流中检测方形对象。一切都很好,但由于主线程的计算负担,视频滞后于帧。

正如您在下面的代码段中看到的,我在NSOperationQueue委托方法CvVideoCameraDelegate中添加了processImage:(cv::Mat&)image当我尝试在后台操作队列和{{1}上运行findSquaresInImage时主队列。

UIImageFromCVMat

但我在这一行- (void)processImage:(cv::Mat&)image NSOperationQueue *videoProcessQueue = [[NSOperationQueue alloc] init]; [videoProcessQueue addOperationWithBlock:^{ // do some time consuming stuff in the background cv::Mat matResultImage = [self findSquaresInImage:image]; //---> Method will return the square object and takes more than 0.3 seconds [[NSOperationQueue mainQueue] addOperationWithBlock:^{ // update the UI here self.imageView.image = [UtilityClass UIImageFromCVMat:matResultImage]; //---> Updates the UI }]; }]; }

中有例外
cv::pyrDown()

enter image description here

这里有什么问题?有任何其他改进方法吗?

//更新:

即使使用GCD块也是同样的问题:

- (cv::Mat)findSquaresInImage:(cv::Mat)_image
{

   std::vector<std::vector<cv::Point> > squares;
    cv::Mat pyr, timg, gray0(_image.size(), CV_8U), gray;
    int thresh = 20, N = 2;
    cv::pyrDown(_image, pyr, cv::Size(_image.cols/2, _image.rows/2)); //----> HERE I GOT EXCEPTION
    cv::pyrUp(pyr, timg, _image.size());
    std::vector<std::vector<cv::Point> > contours;
    //remaining logic goes here........ ...... ...... ...
}

1 个答案:

答案 0 :(得分:0)

最终能够在2次重大更改后解决:

  • 直接将图像从processImage:(cv::Mat&)image映射到CvVideoCamera个对象。从未使用过已初始化的父视图self.imageView

  • 加速过程,包括OpenCVSquares检测库。