1

画像の強度が 16 ビットのバイナリ ファイルがあります。このデータを短い配列で読み取りました。そして、次のコードを使用して 16 ビット グレー イメージを作成します。

 IplImage *img=cvCreateImage( cvSize( Image_width, Image_height ), IPL_DEPTH_16S, 1 );
 cvSetData(img,Data, sizeof(short )*Image_width); 

Data は短い配列です。

次に、この関数を使用してこの画像の ROI を設定します

cvSetImageROI(img, cvRect(crop_start.x, crop_start.y, crop_width, Image_height));

ROI が正常に設定されています。

ROIを設定した後、画像の強度にアクセスしたいということは、トリミングされた画像の強度のポインターが必要であることを意味します。強度にアクセスするためにこのコードを試しました

short *crop_Imagedata=(short *)img->imageData;

しかし、コードをデバッグして確認したため、このポインターは正しい強度を示していません。

画像強度のポインターを取得する方法を教えてください。

前もって感謝します

4

1 に答える 1

0

こんにちは、あなたがやりたいことを見つけるために次のことを試しました:

IplImage *img=cvCreateImage( cvSize( 15, 15 ), IPL_DEPTH_16S, 1 );
cvSet(img,cvScalar(15));//sets all values to 15

cvSetImageROI(img, cvRect(4, 0, 10, 15));
short *crop_Imagedata=(short *)img->imageData;
((*crop_Imagedata) == 15) // true

あなたが得る価値はROIにはありません!IplImage 構造体の imageData は単純なポインターであり、関数ではありません!!! 私の意見では、opencv の rois は十分に文書化されておらず、使いやすいものではありません。たぶん、opencv のすべてのアルゴリズムは何らかの形で rois を使用します。私はそれらを使用しますが、標準のiplimage構造を使用して簡単に使用できる自動機能はありません。もっと魔法が欲しいなら、新しい cv::Mat オブジェクトを使ってみてください...しかし、それでも rois を使いたくないなら、常に使う必要があります

     CvRect roi = cvGetImageROI(img);

常に位置を確認する方法。その後、roi オフセットを追加する必要があります。

((short*)(img->imageData + (roi.y+ypos)*img-widthStep))[roi.x+xpos]

標準の Opencv は C++ ではなく C ライブラリであることを思い出してください。ところで、cv::Mat rois を混合するときは少し面倒です。iplimage を roi なしで cv::Mat にコピーするには、次の手順を実行する必要があります。

CvRect roitmp = cvGetImageROI(ilimage);
cvResetImageROI(ilimage);
cv::Mat tmp = cv::Mat(ilimage).clone();
cvSetImageROI(ilimage,roitmp);

たぶん、ここで誰かが rois を扱う正しい方法を知っています...

于 2012-07-13T11:54:52.940 に答える