访问负像素值OpenCV

我试图在OpenCV中对图像执行过零边缘检测。 我模糊并使用cvLaplace()然后从(0,max)缩放它。 我的问题是:如何以正确识别负值的方式访问该图像中的像素值? 使用OpenCV(cvPtr2D)提供的函数返回无符号字符。 有什么想法或意见吗?

谢谢

像素在内部存储为IPL_DEPTH_8U,这意味着8位无符号字符,范围从0到255.但您也可以将它们打包为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] << " "; } 

不要忘记投票并将此答案标记为已接受,以防万一。