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