8

openCV を使用してビデオを Visual Studio に読み込み、それをグレースケールに変換してから、関数 CV_THRESH_BINARY を使用してバイナリ イメージに変換しました。ただし、フレームに穴やノイズがあります。ノイズや穴を取り除く簡単な方法は何ですか? openCV の Erode 関数と Dilate 関数について調べましたが、それらの使用方法がよくわかりません。これはこれまでの私のコードです。ノイズ除去をコードに組み込む方法を誰かに教えてもらえれば、大歓迎です。

#include "cv.h"
#include "highgui.h"

int main( int argc, char* argv ) {

CvCapture *capture = NULL;
capture = cvCaptureFromAVI("C:\\walking\\lady walking.avi");
if(!capture){
    return -1;
}

IplImage* color_frame = NULL;
IplImage* gray_frame = NULL ;
int thresh_frame = 70;

int frameCount=0;//Counts every 5 frames
cvNamedWindow( "Binary video", CV_WINDOW_AUTOSIZE );

while(1) {
    color_frame = cvQueryFrame( capture );//Grabs the frame from a file
    if( !color_frame ) break;
    gray_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height),      color_frame->depth, 1);
    if( !color_frame ) break;// If the frame does not exist, quit the loop

    frameCount++;
    if(frameCount==5)
    {
        cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY);
        cvThreshold(gray_frame, gray_frame, thresh_frame, 255, CV_THRESH_BINARY);
        cvShowImage("Binary video", gray_frame);
        frameCount=0;
    }
    char c = cvWaitKey(33);
    if( c == 27 ) break;
}

cvReleaseImage(&color_frame);
cvReleaseImage(&gray_frame);
cvReleaseCapture( &capture );
cvDestroyWindow( "Grayscale video" );

return 0;
}
4

2 に答える 2

9

免責事項: 提供した情報が非常に少ないため、適切な回答を提供することは困難です。二値化前と二値化後の画像を投稿すると、はるかに簡単になります。ただし、いくつかのヒントを提供しようとします。

穴がかなり大きい場合は、しきい値が間違っている可能性があります。値を増減してみて、結果を確認してください。あなたが試すことができます

cv::threshold(gray_frame, gray_frame, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

これにより、しきい値が自動的に計算されます。適切なしきい値が見つからない場合は、いくつかの適応しきい値アルゴリズムを試してください。opencv には adaptThreshold() 関数がありますが、あまり良くありません。

穴とノイズがかなり小さい (それぞれ数ピクセル) 場合は、次のいくつかを試すことができます。

  • 開始 (浸食、次の拡張) を使用してホワイト ノイズを除去し、閉鎖 (拡張、次の浸食) を使用して小さなブラック ノイズを除去します。ただし、オープニングはホワイト ノイズを除去すると同時にブラック ノイズも強化し、その逆も同様であることを忘れないでください。

  • しきい値処理を行った後のぼかしの中央値。黒と白の両方の小さなノイズを除去しながら、色 (画像はバイナリのままです) と、小さなエラーの可能性がある形状を保持します。2 値化の前にメディアン ブラーを適用すると、小さなノイズを減らすこともできます。

于 2012-02-17T10:32:18.123 に答える
1

しきい値処理を行う前にSmooth関数を使用してみてください。CV_MEDIAN

于 2012-02-17T05:40:22.990 に答える