-1

これは、Opencv を使用して画像を表示および処理する方法です。

int _tmain(int argc, _TCHAR* argv[]) {
    IplImage* img = cvLoadImage( "MGC.jpg" );
    cvThreshold( img, img,  200, 255, CV_THRESH_BINARY );
    cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
    cvShowImage("Example1", img);
    cvWaitKey(0);
    cvReleaseImage( &img );
    cvDestroyWindow( "Example1" );
    return 0;
}

以下に概説するように、私の目標を達成するのを手伝ってもらえますか?

int _tmain(int argc, _TCHAR* argv[]) {
    Some code here (using some API other than OpenCv).... // Captures a frame and  
    //streams the data into a buffer Buf
    Buffer B= Buf; // B contain binary image data i.e 16 bit pixel values
    cvThreshold( B, B,  200, 255, CV_THRESH_BINARY );//Notice I am putting B and not an 
                                                     //Image(legal?)
    cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
    cvShowImage("Example1", B); //Notice I am putting B and not an Image(legal?)   
    cvWaitKey(0);
    cvReleaseImage( &B );
    cvDestroyWindow( "Example1" );
    return 0;
}

次のような 2 番目のコード スニペットでは、ハードディスクの読み取り/書き込み操作を使用していないことに注意してください。

  IplImage* img = cvLoadImage( "MGC.jpg" );

基本的に、私はリアルタイムのシナリオで作業しているため、時間のかかる をバイパスしていますcvLoadImage。明らかに、データをハードディスクに保存していません。私のデータ全体はまだBuffer B. これにより、アプリケーションにとって重要な時間を節約できます。

注:Buffer B実際には、適用cvminmaxlocなど、 でさらに多くの処理を行う予定です。しかし、これらすべての機能には、私の場合のようなバッファではなく、ディスクからロードされたイメージが必要です。

ハードディスクに保存されているイメージではなく、バッファで作業するという私の目標を達成するために、正しい方向に向けることができますか? openCV の機能を理解するのに何か間違いがありますか?

アップデート:

imdecodeバッファから画像を読み取るために使用できる以下の提案。上記で説明したように、実際には OpenCv 関数を使用して画像の処理を行います。たとえばCVMinMaxLoc

 cvThreshold( src, src,  200, 255, CV_THRESH_BINARY );   

BufferImage in の代わりに最初の引数として入れることができcvThreshold( )ますか? そうでない場合Buffers、openCv 関数を使用して (ピクセル値を含む) を処理する代わりに何ができますか? バッファを操作する直接的な方法がない場合、この目標を達成するための間接的な方法は何ですか? 回避策は何ですか?

要するに、処理を行う前にデータをハードディスクに移動したくありません。

4

4 に答える 4

2

OpenCV の C インターフェイスのほとんどは を扱っており、他のカスタム データ型も扱ってIplImageいないことを理解してください。Bufferつまり、次のことを行います。

Buffer B = Buf; 
cvThreshold( B, B,  200, 255, CV_THRESH_BINARY );

cvThreshold()データを にカプセル化する必要があるため、コンパイル エラーが発生しますIplImage

私は明白な船長になる危険を冒したくありませんが、あなたは に変換する必要がありBufferますIplImage. では、どうやってそれを行うのですか、と尋ねるかもしれません。さて、IplImageこれらの重要な情報をまとめて保持する単純なデータ型です。

  • 画像のサイズ(幅/高さ);
  • 画像のビット深度
  • チャンネル;
  • そして、画像のデータ(ピクセル)。

そして、どのようにIplImageゼロから作成しますか? コールcvCreateImageHeader()の後にcvSetData().

:深さパラメーターについては、 IPL_DEPTH_16U または IPL_DEPTH_16Sのいずれかを使用することをお勧めします。イメージが RGB の場合、チャネル数は 3 です。 の使用が終了したら、を呼び出してそのリソースを解放することを IplImage忘れないでください。cvReleaseImage()

本当の課題は、これらすべての情報を からどのように抽出するかですBuffer。幸運を!

于 2012-07-06T02:48:52.473 に答える
1

imdecodeC++ OpenCV API には、メモリ バッファーに格納された画像をデコードできる関数があります。しかし、レガシー C API には類似物はありません。

于 2012-06-30T11:11:34.643 に答える
0

src の代わりにバッファ(ピクセル値を持つと言ったように)、つまり、次のディスクからロードされたイメージを配置できるとは思わない

  cvThreshold( src, src,  200, 255, CV_THRESH_BINARY );   

1 つの方法は、MAT でバッファーを変換してから cvThreshold を使用することです。

より多くの経験を積んだ誰かがこれについてコメントするかもしれません。

于 2012-07-03T06:55:57.213 に答える
0

バッファを openCV タイプのMatに変換する必要があります

似たようなことがここで行われます

于 2012-07-05T13:47:49.343 に答える