使用强大的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()
这里有什么问题?有任何其他改进方法吗?
//更新:
即使使用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........ ...... ...... ...
}
答案 0 :(得分:0)
最终能够在2次重大更改后解决:
直接将图像从processImage:(cv::Mat&)image
映射到CvVideoCamera
个对象。从未使用过已初始化的父视图self.imageView
。
加速过程,包括OpenCVSquares检测库。