Opencv ...获取IPLImage或CvMat中的数据

时间:2011-05-25 15:53:48

标签: python opencv iplimage

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

由于

3 个答案:

答案 0 :(得分:5)

使用LoadImageM将图片文件直接加载到cvmat的快速示例:

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, g, r * 0.5)

答案 1 :(得分:1)

CvMat和IplImage都提供tostring方法,返回表示原始数据的字符串。使用图像数据,您可以弄清楚如何将字符串数据解释为矩阵。

您应该能够使用fromarray将数据字符串转换回图像对象。

要将字符串转换为数组,请考虑在Python中使用array模块。例如:

array.array('B', CvMat.tostring()) # 'B' is unsigned char, for rgb8 images

要获得像素之间的“步幅”,请使用:

stride = CvMat.step / CvMat.cols

然后典型的数组索引来获取单个像素。您可能希望将所有这些包含在隐藏所有令人讨厌的复杂性的类中。

答案 2 :(得分:0)

我不知道opencv python绑定,但是在C或C ++中你必须得到存储在IplImage中的缓冲区指针。该缓冲区根据图像格式编码(也存储在IplImage中)。对于RGB,你有一个R字节,一个G字节,一个B字节,依此类推。

查看python绑定的API,你会发现如何访问缓冲区然后你可以获得像素信息。

MY2C