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

发布于 2024-11-10 03:24:48 字数 110 浏览 0 评论 0原文

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

谢谢

I am doing some simple programs with opencv in python. I want to write a few algorithms myself, so need to get at the 'raw' image data inside an image. I can't just do image[i,j] for example, how can I get at the numbers?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

楠木可依 2024-11-17 03:24:48

使用 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)

Quick example of using LoadImageM to load an image file directly into a 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]

Output:

<type 'cv.cvmat'>
(21.0, 122.0, 254.0)

Quick example showing how to multiple one or more color channels by 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)
像你 2024-11-17 03:24:48

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

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

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

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

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

stride = CvMat.step / CvMat.cols

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

Both CvMat and IplImage provide tostring methods that return a string representing the raw data. Using the image data, you can figure out how to interpret the string data as a matrix.

You should be able to use fromarray to convert the data string back into an image object.

To convert the string to an array, consider using the array module in Python. For instance:

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

To get the 'stride' between pixels, use:

stride = CvMat.step / CvMat.cols

Then typical array indexing to get individual pixels. You would probably want to wrap all this up in a class that hides all the nasty complexity.

擦肩而过的背影 2024-11-17 03:24:48

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

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

我的2c

I do not know opencv python bindings, but in C or C++ you have to get the buffer pointer stored in IplImage. This buffer is coded according to the image format (also stored in IplImage). For RGB you have a byte for R, a byte for G, a byte for B, and so on.

Look at the API of python bindings,you will find how to access the buffer and then you can get to pixel info.

my2c

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文