私は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イメージを保存するのに成功しましたが、今はもっと効率的なものが必要です。配列からイメージを保存する方法が異なる場合は、代わりにそのイメージを使用してください。
あなたの「データ」の説明はちょっと混乱していますが、もっと明確にすることはできますか?各チャネル(単一R)は整数(int)ですか?または、それぞれが符号なしのcharであり、一緒にint(1つの追加の符号なしcharを持つ)を作成しますか? – cxyzs7