-1
    cvCvtColor(img,dst,CV_RGB2YCrCb);
    for  (int col=0;col<dst->width;col++) 
    { 
        for (int row=0;row<dst->height;row++) 
        { 
            int idxF = row*dst->widthStep + dst->nChannels*col; // Read the image data 
            CvPoint pt = {row,col};
            temp_ptr2[0] += temp_ptr1[0]* 0.0722 + temp_ptr1[1] * 0.7152 +temp_ptr1[2] *0.2126  ;   // channel Y 
        }
    }

しかし、結果は次のとおりです。

ここに画像の説明を入力

どこが間違っているのか教えてください。

4

1 に答える 1

1

このコード サンプルについては、多くのことが言えます。

  • まず、古い C スタイルの API (IplImageポインター、cvBlah関数など) を使用していますが、これは時代遅れで保守がより困難です (特に、メモリ リークが発生しやすい)。そのため、C++ スタイルの構造体と関数の使用を検討する必要があります。 (cv::Mat構造とcv::blah機能)。

  • あなたのエラーはおそらく最初の指示から来ていますcvCopy(dst,img);。これにより、処理を開始する直前に入力画像が何も満たされないため、この行を削除する必要があります。

  • 速度を最大にするには、2 つのループを逆にして、最初に行を反復し、次に列を反復する必要があります。これは、OpenCV のイメージが行ごとにメモリに格納されるためです。したがって、列を増やしてイメージにアクセスする方が、キャッシュの使用に関してより効率的です。

  • 一時変数idxFは使用されないため、おそらく次の行も削除する必要があります。

    int idxF = row*dst->widthStep + dst->nChannels*col;
    
  • イメージ データにアクセスしてピクセルをtemp_ptr1およびに格納すると、および座標temp_ptr2の位置が入れ替わります。次の方法で画像にアクセスする必要があります。xy

    temp_ptr1  = &((uchar*)(img->imageData + (img->widthStep*pt.y)))[pt.x*3];
    
  • に割り当てられたメモリを決して解放しないためdst、アプリケーションでメモリ リークが発生します。cvReleaseImage(&dst);関数の最後に呼び出します。

于 2014-03-01T13:42:24.397 に答える