Opencv ... получение данных в IPLImage или CvMat - PullRequest
4 голосов
/ 25 мая 2011

Я делаю несколько простых программ с opencv на python.Я сам хочу написать несколько алгоритмов, поэтому мне нужно получить «сырые» данные изображения внутри изображения.Я не могу просто сделать изображение [i, j], например, как я могу получить на цифры?

Ответы [ 3 ]

5 голосов
/ 25 мая 2011

Быстрый пример использования 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 голос
/ 25 мая 2011

И CvMat, и IplImage предоставляют методы tostring, которые возвращают строку, представляющую необработанные данные.Используя данные изображения, вы можете понять, как интерпретировать строковые данные в виде матрицы.

Вы можете использовать fromarray для преобразования строки данных обратно в объект изображения.

Чтобы преобразовать строку в массив, рассмотрите возможность использования array*Модуль 1009 * в Python.Например:

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

Чтобы получить «шаг» между пикселями, используйте:

stride = CvMat.step / CvMat.cols

Затем типичное индексирование массива для получения отдельных пикселей.Возможно, вы захотите обернуть все это в классе, который скрывает всю отвратительную сложность.

0 голосов
/ 25 мая 2011

Я не знаю привязок Python opencv, но в C или C ++ вы должны получить указатель буфера, хранящийся в IplImage. Этот буфер кодируется в соответствии с форматом изображения (также хранится в IplImage). Для RGB у вас есть байт для R, байт для G, байт для B и т. Д.

Посмотрите на API привязок Python, вы найдете, как получить доступ к буферу, а затем вы можете получить информацию о пикселях.

my2c

...