我正在尝试在 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] << " ";
}
不要忘记投票并将此答案标记为已接受,以防万一。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)