저는 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에서 비디오 처리에 대한 튜토리얼 때문에 감사하겠습니다 내가 찾은 모든 것이 다른 환경을 사용하거나 최적화가 필요한 충분한 프로세스 시간을 사용하지 않고 있었던 것입니다.