0

RGB 画像を YCbCr 画像に変換するルーチンの実行時間を短縮しようとしています。私のコードは次のようになります。

cv::Mat input(BGR->m_height, BGR->m_width, CV_8UC3, BGR->m_imageData);
cv::Mat output(BGR->m_height, BGR->m_width, CV_8UC3);

cv::cvtColor(input, output, CV_BGR2YCrCb);

cv::Mat outputArr[3];
outputArr[0] = cv::Mat(BGR->m_height, BGR->m_width, CV_8UC1, Y->m_imageData);
outputArr[1] = cv::Mat(BGR->m_height, BGR->m_width, CV_8UC1, Cr->m_imageData);
outputArr[2] = cv::Mat(BGR->m_height, BGR->m_width, CV_8UC1, Cb->m_imageData);  

split(output,outputArr);

ただし、インターリーブされた RGB イメージを別のチャネル イメージにコピーする冗長な分割操作があるため、このコードは低速です。cvtColor 関数で、既にチャネル イメージに分割されている出力を作成する方法はありますか? ベクトルまたは行列の配列を入力として受け入れる _OutputArray クラスのコンストラクターを使用しようとしましたが、うまくいきませんでした。

4

3 に答える 3

0

画像データのコピーが制限ステップであると確信していますか?
Yはどのように制作していますか?Cr / Cb cv::mats?
この関数を書き直して、結果を 3 つの別々の画像に書き込むことはできますか?

于 2012-12-10T17:02:28.777 に答える
0

cv::cvtColor の呼び出しオプションはありません。これにより、3 つの個別の cv::Mats (チャネルごとに 1 つ) として結果が得られます。

dst – src と同じサイズと深さの出力画像。

ソース: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor

結果からピクセルをコピーするか (既に行っているように)、そのような変換関数を自分で作成する必要があります。

于 2012-12-10T22:04:51.733 に答える