2016-07-20 15 views
1

私はC++を使用しており、画像データのvoid *配列を持っています。私はそれがRGBピクセル値の配列であると判断し、結果の画像の幅と高さについての情報を持っています。各ピクセル値は、インターリーブされたR、G、およびBの整数の整数(すなわち、123456 = R:12、G:34、B:56)である。この配列をOpenCV Matイメージに変換する必要があります。私はこのオンラインの多くの例を見つけましたが、どれも成功していません。C++ - RGB 1-D ArrayをOpenCV Matに変換する

cv::Mat image = cv::Mat(width*height*4, 1, CV_8U, (unsigned*)data); 
cv::Mat reshaped = image.reshape(0, height); 
cv::imwrite("Test.jpg", reshaped); 

上記のコードは、グレースケール、私のカラー画像の細長いバージョンを保存します。ここでは私のための作業に最も近い来ているコードの簡略バージョンです。私も試した:

cv::Mat image = cv::Mat(width, height, CV_8U, (unsigned*)data); 
cv::imwrite("Test.jpg", image); 

上記のコードは、私のカラー画像のグレースケールの細かいバージョンを保存します。私が試した他のもの(CV_16U、CV_32F、(byte *)データなど)は、ちょうど黒い画像を返しました。私は間違って何をしていますか?

また、forループを使用せずにC++を使用してアレイからイメージを保存する簡単な方法が見つからないため、OpenCVのみを使用しています。私はすべてのピクセルをループして個別に保存することでPPMイメージを保存するのに成功しましたが、今はもっと効率的なものが必要です。配列からイメージを保存する方法が異なる場合は、代わりにそのイメージを使用してください。

+0

あなたの「データ」の説明はちょっと混乱していますが、もっと明確にすることはできますか?各チャネル(単一R)は整数(int)ですか?または、それぞれが符号なしのcharであり、一緒にint(1つの追加の符号なしcharを持つ)を作成しますか? – cxyzs7

答えて

1

カラー画像を取得する場合は、タイプCV_8Uでは不十分です。このタイプは、シングルチャネル 8ビットイメージを表します。あなたのデータが確かに32ビット整数の配列の場合は、CV_8UC4です。

cv::Mat image = cv::Mat(width, height, CV_8UC4, (unsigned*)data); 

第4チャンネルはアルファ値(透明度)を表します。それをドロップしたい場合は、OpenCVに画像をCV_8UC3に変換するよう依頼することができます。

image = cv2.cvtColor(image, cv2.CV_BGRA2BGR) 

また、OpenCVはBGR順序のカラー値を表すことに注意してください。画像を作成する際には、データがBGR形式であることを確認してください。

+0

ありがとうございます - これはうまくいった!私はそれには型と関係があると思っていましたが、それを理解するにはC++/OpenCVで十分に熟達していませんでした。 – OCW

関連する問題