Opencv…获取IPLImage或CvMat中的数据

问题描述

| 我正在用python中的opencv做一些简单的程序。我想自己写一些算法,因此需要获取图像中的“原始”图像数据。例如,我不能只做图像[i,j],如何得到数字? 谢谢     

解决方法

使用“ 0”将图像文件直接加载到“ 1”中的快速示例:
import cv

path = \'stack.png\'
mat = cv.LoadImageM(path,cv.CV_LOAD_IMAGE_UNCHANGED)
x,y = 42,6
print type(mat)
print mat[y,x]
输出:
<type \'cv.cvmat\'>
(21.0,122.0,254.0)
快速示例显示如何通过
0.5
来选择一个或多个颜色通道:
for x in xrange(mat.cols):
    for y in xrange(mat.rows):
        # multiply all 3 components by 0.5
        mat[y,x] = tuple(c*0.5 for c in mat[y,x])

        # or multiply only the red component by 0.5
        b,g,r = mat[y,x]
        mat[y,x] = (b,r * 0.5)
    ,CvMat和IplImage都提供了“ 6”方法,这些方法返回表示原始数据的字符串。使用图像数据,您可以弄清楚如何将字符串数据解释为矩阵。 您应该能够使用
fromarray
将数据字符串转换回图像对象。 要将字符串转换为数组,请考虑在Python中使用
array
模块。例如:
array.array(\'B\',CvMat.tostring()) # \'B\' is unsigned char,for rgb8 images
要获得像素之间的“跨距”,请使用:
stride = CvMat.step / CvMat.cols
然后进行典型的数组索引以获取单个像素。您可能希望将所有这些包装在一个隐藏所有令人讨厌的复杂性的类中。     ,我不知道opencv python绑定,但是在C或C ++中,您必须获取存储在IplImage中的缓冲区指针。该缓冲区根据图像格式编码(也存储在IplImage中)。对于RGB,您有一个用于R的字节,一个用于G的字节,一个用于B的字节,依此类推。 查看python绑定的API,您将发现如何访问缓冲区,然后可以获取像素信息。 my2c