【问题标题】:Accessing negative pixel values OpenCV访问负像素值 OpenCV
【发布时间】:2011-03-18 15:11:50
【问题描述】:

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

谢谢

【问题讨论】:

    标签: c++ c opencv gaussian edge-detection


    【解决方案1】:

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

    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] << " "; 
    }
    

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

    【讨论】:

    • 感谢您的回复!知道如何在不使用 cvPtr2D() 的情况下访问这些像素吗?我正在尝试使用 (float*)(new_img->imageData + x*new_img->widthStep + y) 手动访问它们,其中 x -> new_img->height 和 y -> width。但是没有成功。
    • 我编辑了我的答案,以便能够添加代码并回答您的评论。如果对您有帮助,请不要忘记投票。 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2012-02-14
    • 1970-01-01
    • 2013-07-28
    • 2017-04-01
    • 2011-06-12
    相关资源
    最近更新 更多