OpenCVの画像でゼロ交差エッジ検出を実行しようとしています。ぼかしてcvLaplace()を使用し、(0、max)からスケーリングします。私の質問は、負の値を正しく識別するような方法で、その画像のピクセル値にアクセスするにはどうすればよいですか?OpenCV(cvPtr2D)が提供する関数を使用すると、符号なし文字が返されます。アイデアやコメントはありますか?
ありがとうございました
OpenCVの画像でゼロ交差エッジ検出を実行しようとしています。ぼかしてcvLaplace()を使用し、(0、max)からスケーリングします。私の質問は、負の値を正しく識別するような方法で、その画像のピクセル値にアクセスするにはどうすればよいですか?OpenCV(cvPtr2D)が提供する関数を使用すると、符号なし文字が返されます。アイデアやコメントはありますか?
ありがとうございました
ピクセルは内部でIPL_DEPTH_8Uとして格納されます。これは、0〜255の範囲の8ビットunsigned charを意味します。ただし、IPL_DEPTH_16S(符号付き整数)、さらにはIPL_DEPTH_32F(単精度浮動小数点数)としてパックすることもできます。
cvConvertScale()はおそらくその仕事をします!ただし、手動で変換する場合: OpenCVはIPL_DEPTH_32SをIPL_DEPTH_32Fに変換する必要があります
基本的な考え方は、cvCreateImage()と必要な形式で新しい画像を作成し、cvConvertScale()を使用して元のデータを新しい形式にコピーすることです。最終的に、コードは次のようになります。
IplImage* img = cvLoadImage("file.png", CV_LOAD_IMAGE_ UNCHANGED);
// then retrieve size of loaded image to create the new one
IplImage* new_img = cvCreateImage(img_size, IPL_DEPTH_16S, 1);
cvConvertScale(img, new_img, 1/255.0, -128);
これはスレッドの質問に答えると思います。
コメントに答えると、次のようにピクセル情報にアクセスできます。
IplImage* pRGBImg = cvLoadImage(input_file.c_str(), CV_LOAD_IMAGE_UNCHANGED);
int width = pRGBImg->width;
int height = pRGBImg->height;
int bpp = pRGBImg->nChannels;
for (int i=0; i < width*height*bpp; i+=bpp)
{
if (!(i % (width*bpp))) // print empty line for better readability
std::cout << std::endl;
std::cout << std::dec << "R:" << (int) pRGBImg->imageData[i] <<
" G:" << (int) pRGBImg->imageData[i+1] <<
" B:" << (int) pRGBImg->imageData[i+2] << " ";
}
投票した場合に備えて、投票してこの回答に承認済みのマークを付けることを忘れないでください。