13

ライブビデオフィードでエッジ検出を行っています:

- (void)processImage:(Mat&)image;
{
        cv::resize(image, smallImage, cv::Size(288,352), 0, 0, CV_INTER_CUBIC);
        edgeDetection(smallImage);
        cv::resize(smallImage, image, image.size(), 0, 0, CV_INTER_LINEAR);
}

edgeDetectionはかなり重い作業を行っており、ビデオ フレーム サイズが 1280x720 の非常に低いフレームレートで実行されていました。resize呼び出しを追加すると、フレームレートが劇的に低下しました。これは、私が予想していたものとはまったく逆です。これは、サイズ変更操作が遅いためですか、それとも私が何か間違ったことをしているからですか?

smallImageヘッダーで次のように宣言されています。

@interface CameraController : UIViewController
<CvVideoCameraDelegate>
{
    Mat smallImage;
}

それの初期化はなく、正常に動作します。

4

3 に答える 3

22

画像のサイズ変更は遅く、処理されたフレームごとに 2 回行っています。解決策を改善する方法はいくつかありますが、解決しようとしている問題について詳細を提供する必要があります。

まず、エッジを検出する前に画像のサイズを変更すると、エッジ検出に提供される情報が少なくなるため、検出されるエッジが少なくなるか、少なくともエッジの検出が難しくなります。

また、使用されるサイズ変更アルゴリズムも速度に影響します。メモリが故障していない場合、CV_INTER_LINEAR は cv::resizeで最速です。最初のサイズ変更には CV_INTER_CUBIC を使用しています。

画像のサイズを変更する1 つの代替方法は、代わりに元の画像のより小さい領域を処理することです。そのためには、opencv 画像の ROI (関心領域)を確認する必要があります。それは非常に簡単です。このサイトには、それらに関する多くの質問があります。欠点は、問題によっては、画像全体ではなく、領域内のエッジのみを検出することです。これは問題ない場合があります。

本当に画像のサイズを変更したい場合、 opencv開発者は通常、より小さな画像を処理したい場合に、resizeではなく pyrDown 関数とpyrUp関数を使用します。速いからだと思いますが、念のためテストしてみてください。pyrDown と pyrUp の詳細については、このリンクを参照してください。

cv::resize アルゴリズムについては、次のリストを参照してください。

INTER_NEAREST - a nearest-neighbor interpolation
INTER_LINEAR - a bilinear interpolation (used by default)
INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood
INTER_LANCZOS4 - a Lanczos interpolation over 8x8 pixel neighborhood

INTER_LINEARがそれらすべての中で最速であるかどうかはわかりませんが、 INTER_CUBICよりも確実に高速です。

于 2013-02-13T21:08:08.437 に答える