1

カメラ (PAL) からのデータ ストリームがあります。コールバック関数から取得したデータ型は、U0-Y0-V0-Y1 U2-Y2-V2-Y3 U4-Y4-V4-Y5 ....のような形式です。 ..

OpenCV の cvCvtColor() 関数を使用して、カラー フォーマットを RGB (または BGR) に変更する必要があります。関数の使用法は cvCvtColor(YCrCb, dst, CV_YCrCb2BGR); です。ここで(実際には前に)問題が発生します。dst は 3 チャネルの 8U イメージです。それで問題ありませんが、コールバック関数からのデータを IplImage に直接格納するにはどうすればよいですか? 正しく保存できれば、cvCvtColor() を使用して画像を変換できます。関数、他のライブラリはありますか? すべてのフレームで RGB<->YUV 数学変換を使用すると、CPU 使用率が 70%++ になるため、使用したくありません。CPU のより簡単な方法を探しています。

4

4 に答える 4

4

入力形式が YUY2 の場合、実際には YUYV であり、以下の例ではそれを想定しています。ただし、形式が実際に UYVY である場合は、例または色空間で順序を変更するだけです (以下の注を参照)。

この YUY2/YUYV422 データは、2 チャネルの Mat 配列を介して OpenCV に提示できます。

Mat img を埋める方法は 2 つあります。コピーによる方法と参照による方法です。用途に応じて、どちらかをお選びいただけます。

どちらも、char 配列に yuv データがあると想定していますimage_yuv

1a. 元のデータを参照する (メモリ割り当てなし; 高速):

Mat img(height, width, CV_8UC2, img_yuv);

1b. データを Mat にコピーすることにより:

Mat img(height, width, CV_8UC2);
uchar *pix = img.ptr<uchar>(r); // first byte of the row in image
for (int r = 0, b=0; r < height; r++) {
    for (int c = 0; c < width; c+=4) {
        *pix++ = image_yuv[b++]; // y
        *pix++ = image_yuv[b++]; // u
        *pix++ = image_yuv[b++]; // y
        *pix++ = image_yuv[b++]; // v
    }
}

Mat img にデータがあるので、cvtColor を使用して他の色空間に変換できます。

2a. BGR に変更:

cvtColor(img, img_p, COLOR_YUV2BGR_YUY2);
imshow("window", img_p);

2b. グレースケールに変更:

cvtColor(img, img_p, COLOR_YUV2GRAY_YUY2);
imshow("window", img_p);

注: 形式が UYVY の場合は、コピー順序を変更するか、カラー スペース (COLOR_YUV2BGR_UYVY または COLOR_YUV2GRAY_UYVY) を変更します。OpenCV ソース コードの imgproc.hpp を参照してください。

于 2015-11-28T23:51:20.347 に答える
0

次のようなフレーム バッファーの Ipliimage ヘッダーを作成します。

    IplImage* header = cvCreateImageHeader(cvSize(width,height), IPL_DEPTH_8U, 3);
    headercopy->widthStep = width*3;//I hope this will right for you... :)
    headercopy->imageData = (char*) bufferstart;

Iplimage ヘッダーを通常の Iplimage の希望として使用できるようになりました。変換のために、新しい IplImage オブジェクトを割り当てる必要があるかもしれません!

于 2012-07-18T13:21:42.987 に答える
0

IIRC openCV はインターリーブされた YUV をサポートしていません。平面 YUV420/YUV422 のみをサポートします。ここでは、イメージ全体の Y データの後に低解像度の U と V (JPEG で使用されるように) が続きます。

データをプレーンに並べ替えるか、こちらの数式を使用して RGB データを自分で生成するか、この回答のConverting YUV->RGB(Image processing)->YUV during onPreviewFrame in android?のより高速な整数バージョンを使用して単純に生成できます。

于 2012-07-18T13:56:16.813 に答える
0

また、YUV 4:2:2 を RGB に変換するためのこのコードを見つけたので、これが役立つかもしれません.... YUV422 を RGB24 に変換します(これはありません)。彼は画像をopencv標準RGB24に変換するためのコードを提供していないため、cコードを理解し、opencv標準に適応させる必要があります: http://wss.co.uk/pinknoise/yuv2rgb/

どういうわけか私は良い解決策を見つけることができません....

于 2012-07-18T14:18:03.797 に答える