0

たとえば、C++で画像データをcharからdoubleに変換しようとしています。

Mat img = imread(image_file);
Mat img_double;
img.convertTo(img_double, CV64FC3);

次に、img_doubleは画像データをDOUBLEに格納する必要があると思います。そして、6として表示されるimg_double.depth()を試しました。これは正しいです。ただし、そのDOUBLEデータにアクセスするにはどうすればよいですか?img_double.dataはまだuchar*タイプです。誰か助けてもらえますか?ありがとう!

4

3 に答える 3

1

C / C ++はunsigned char、一連のバイトのジェネリックデータ型として使用します。したがって、ucharデータポインタを使用するcv::Matと、画像の種類ごとにthsiポインタの宣言が変更されなくなり、サブクラス化が回避され、ポインタの影響cv::Matによる直接データ転送が可能になりmemcpyます。

次に、キャストを使用して、ライブラリのユーザーが希望するデータ型を返します。

OpenCV 2.xはcv::Mat::ptr<type>(ìnt rowIndex)、特定の行の先頭へのポインターを取得するためのテンプレート関数を提供することに注意してください。たとえば、doubleデータ型の灰色の画像の行6の先頭へのポインタは、次のように実行されます。

double *rowPtr = my_mat.ptr<double>(6)
于 2013-03-18T08:08:26.637 に答える
0

img_dataは常にucharです(バイトです-それがすべてのメモリです)。画像タイプは、考えたいタイプと範囲を追跡するだけです。

Opencv CVは本質的にCライブラリであるため、データを実際に他のタイプに自動的に変換する方法はありませんが、いつでもキャストすることができます。

于 2013-03-18T03:46:52.350 に答える
0

img_doubleのデータには以下の方法でアクセスできます。

img_double.at<Vec3d>(i, j)[0] -> B
img_double.at<Vec3d>(i, j)[1] -> G
img_double.at<Vec3d>(i, j)[2] -> R

imgしたがって、とのピクセル値にアクセスするにはdouble_img、次のようにすることができます

printf("%d %d %d\n", img.at<Vec3b>(0, 0)[0], img.at<Vec3b>(0, 0)[1], img.at<Vec3b>(0, 0)[2]);
printf("%f %f %f\n", double_img.at<Vec3d>(0, 0)[0], double_img.at<Vec3d>(0, 0)[1], double_img.at<Vec3d>(0, 0)[2]);

これはもっと役立つかもしれません。

于 2013-03-18T06:22:53.943 に答える