1

8ビットの入力カラーイメージ(入力ファイルはa.bmpファイル)のすべてのデータを新しい16ビットのマット配列に入れたいです。

これを行うのは、いくつかの画像パッチを合計してから、各ピクセルの平均値を作成する必要があるためです。

Mat img = imread(Inputfile);   //there now should be values between 0 and 255 

たとえば、次のように青い値に対処します

uchar* ptr = img.data + img.step*row;
cout << ptr[n*col] << endl;

単一の文字のみが表示され、値は表示されません。

cout << static_cast<short>(ptr[n*col]) << endl;

短いまたは大きいものに型キャストすると、正しい値が表示されます。しかし、unsigned char(私の意見では正しいデータ型)にキャストすると、型キャストがない場合と同じ文字が表示されます。

私が知っているように、Shortには2バイトがありますが、color.bmpにはチャネルごとに1バイトの色情報しかありません。最悪の場合81(128 = 7ビットより小さい)ピクセル値を合計する必要があるので、ターゲット値としての短い値が大きいと思いました。

8ビット値に簡単にアクセスして16ビット配列で使用する正しい方法に関するヘルプは素晴らしいでしょう。

ありがとうございました。

4

1 に答える 1

1

キャストは正しく機能しますが、unsigned charを出力ストリームに送信すると、文字として解釈され、文字として出力されます。

また、OpenCVには、行列を別のデータ型に変換する機能がすでに備わっていることにも注意してください。画像を優先データ型のマトリックスに読み込むこともできます。

cv::Mat3s img = cv::imread(...);

また、データポインタの使用は無視されます。クリーンな方法で単一のピクセルまたは行にアクセスする方法(イテレーター、operator()、operator [] ...)に関するOpenCVのドキュメントをお読みください。

于 2012-04-25T15:29:50.217 に答える