c++ - 访问负像素值 OpenCV

标签 c++ c opencv gaussian edge-detection

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

谢谢

最佳答案

像素在内部存储为 IPL_DEPTH_8U,这意味着 8 位无符号字符,范围从 0 到 255。但是您也可以将它们打包为 IPL_DEPTH_16S(有符号整数)甚至 IPL_DEPTH_32F(单精度 float )。

cvConvertScale() 可能会完成这项工作!但是如果你想手动转换它: OpenCV need to convert IPL_DEPTH_32S to 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] << " "; 
}

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

关于c++ - 访问负像素值 OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3293471/

相关文章:

c# - 如何在 C# 中将数组转换为 openCV Mat 对象?

从运行时的角度来看 JavaCV 与 OpenCV

c++ - 保证逻辑与表达式中的函数调用

c++ - 为什么我的数组声明为引用数组

c# - ERROR_MORE_DATA ---- 从注册表读取

c - x87 双加法不起作用

c - 编写程序执行 sum = 1+ (1+2) + (1+2+3) + ... + (1+2...+n)

c - 不确定的 C 行为 ?"Fork bomb"

c++ - 如何用无限循环停止QThread

c# - 当我将图像提供给经过训练的模型时,它为未在模型中训练的对象提供了 80% 以上的准确度