Подтвердить что ты не робот

Конвертировать изображение openCV в изображение PIL в Python (для использования с библиотекой Zbar)

Я пытаюсь использовать методы обнаружения QR-кода библиотеки Zbar на изображениях, которые я извлекаю с помощью методов камеры OpenCV. Обычно методы обнаружения QR-кода работают с изображениями (jpg, png и т.д.) На моем компьютере, но я думаю, что захваченные кадры OpenCV различны.
Есть ли способ сделать захваченный кадр в изображении PIL?

Спасибо.

from PIL import Image
import zbar
import cv2.cv as cv

capture = cv.CaptureFromCAM(1)
imgSize = cv.GetSize(cv.QueryFrame(capture))
img = cv.QueryFrame(capture)

#SOMETHING GOES HERE TO TURN FRAME INTO IMAGE
img = img.convert('L')
width, height = img.size

scanner = zbar.ImageScanner()
scanner.parse_config('enable')
zbar_img = zbar.Image(width, height, 'Y800', img.tostring())

# scan the image for barcodes
scanner.scan(zbar_img)

for symbol in zbar_img:
    print symbol.data
4b9b3361

Ответ 1

С помощью python CV2 вы также можете сделать это:

import Image, cv2

cap = cv2.VideoCapture(0) # says we capture an image from a webcam
_,cv2_im = cap.read()
cv2_im = cv2.cvtColor(cv2_im,cv2.COLOR_BGR2RGB)
pil_im = Image.fromarray(cv2_im)
pil_im.show()

Ответ 2

Думаю, я нашел ответ. Я позже отредактирую результаты.

Изображение OpenCV для PIL

import Image, cv
cv_im = cv.CreateImage((320,200), cv.IPL_DEPTH_8U, 1)
pi = Image.fromstring("L", cv.GetSize(cv_im), cv_im.tostring())

Источник: http://opencv.willowgarage.com/documentation/python/cookbook.html

Ответ 3

Вы пытаетесь получить изображение RGB? Если это так, вам нужно изменить свои параметры следующим образом:

cv_im = cv.CreateImage((320,200), cv.IPL_DEPTH_8U, 1)
pi = Image.fromstring("L", cv.GetSize(cv_im), cv_im.tostring())

:

cv_im = cv.CreateImage((320,200), cv.IPL_DEPTH_8U, 3)
pi = Image.fromstring("RGB", cv.GetSize(cv_im), cv_im.tostring())

поскольку он задокументирован почти нигде, но параметр "L" для Image.fromstring для 8-битных изображений B & W. Кроме того, вам нужно изменить аргумент функции cv.CreateImage с 1 (одноканальное изображение) на 3 (3 канала = RGB).

Надеюсь, это сработает для вас. Приветствия

Ответ 4

Простой способ - напрямую поменять каналы. Предположим, вы пытаетесь конвертировать 3-канальный файл изображения между форматом OpenCV и форматом PIL. Вы можете просто использовать:

img[...,[0,2]]=img[...,[2,0]]

Таким образом, вы не будете беспокоиться о cv2.cvtColor как эта функция работает только с изображениями с определенной глубиной.

Ответ 5

Я сталкиваюсь с той же проблемой. По сути, я пытаюсь использовать свой собственный классификатор изображений (модифицированный InceptionV3), но способ, которым PIL и OpenCV считывают изображения, существенно отличается. Я попробовал ответ от @s_kanawat, @QuantumRich и @Qin Heyang. К сожалению, ни один из них не работал для меня, изображение не будет преобразовано обратно в формат PIL, и мой классификатор изображений выбрасывает результаты мусора. Есть идеи почему?