【问题标题】:How to access the elements of single channel IplImage in Opencv如何在 Opencv 中访问单通道 IplImage 的元素
【发布时间】:2012-03-13 07:32:16
【问题描述】:

如何访问 IplImage(单通道和 IPL_DEPTH_8U 深度)的 元素

我想更改图像特定 (x, y) 位置的像素值。

【问题讨论】:

    标签: c++ c opencv


    【解决方案1】:

    opencv 提供 CV_IMAGE_ELEM 方法来访问 IplImage 的元素,它是一个宏,

    define CV_IMAGE_ELEM( image, elemtype, row, col )       \
        (((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])
    

    第二个参数是类型

    【讨论】:

    • 这通常是正确的方法,但我认为在这种受限情况下(8 位单通道)值得使用 imageData 字节。
    【解决方案2】:

    像素存储在 imageData 数组中。 所以,由于你的图像是单通道的,你只需要这样做:

    myimage.imageData[y*myimage.width+x] = 100;
    

    这确保了 imageData 中从缓冲区开始的正确偏移量,并且它比任何其他指针代数运算都更具可读性。

    在 N 通道图像中,将数组偏移量乘以 N 并加上要读取的通道数就足够了:

    即对于 RGB 图像

    myimage.imageData[3*(y*myimage.width+x)+0] = 100; //Red
    myimage.imageData[3*(y*myimage.width+x)+1] = 100; //Green
    myimage.imageData[3*(y*myimage.width+x)+2] = 100; //Blue
    

    可以根据您要达到的目标进行任何避免将数据相乘以获得索引的优化。

    【讨论】:

    • 我相信你应该使用 -> 而不是 .
    • 这取决于 myimage 实际上是什么,但一般来说......你是对的
    【解决方案3】:

    获取像素值的快速方法是使用宏。

    CV_IMAGE_ELEM( image_header, elemtype, y, x_Nc ) 
    

    在你的情况下,图像是单通道的。所以你可以得到 i,j 像素值

    CV_IMAGE_ELEM(image, unsigned char, i, j)
    

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      相关资源
      最近更新 更多