在 Python 中将 openCV 图像转换为 PIL 图像(用于 Zbar 库)

Posted

技术标签:

【中文标题】在 Python 中将 openCV 图像转换为 PIL 图像(用于 Zbar 库)【英文标题】:convert openCV image into PIL Image in Python (for use with Zbar library) 【发布时间】:2012-11-14 14:20:29 【问题描述】:

我正在尝试对使用 OpenCV 的相机方法提取的图像使用 Zbar 库的 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

【问题讨论】:

【参考方案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())

因为它几乎没有记录,但 Image.fromstring 的“L”参数适用于 8 位黑白图像。此外,您需要将 cv.CreateImage 函数的参数从 1(单通道图像)更改为 3(3 通道=RGB)。

希望它对你有用。 干杯

【讨论】:

【参考方案4】:

一种简单的方法是直接交换频道。假设您尝试在 OpenCV 格式和 PIL 格式之间转换 3 通道图像文件。您可以使用:

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

这样,您就不会被cv2.cvtColor 所困扰,因为此功能仅适用于具有一定深度的图像。

【讨论】:

以上是关于在 Python 中将 openCV 图像转换为 PIL 图像(用于 Zbar 库)的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV 中将图像转换为彩色铅笔素描

如何在opencv中将图像转换为矩阵[重复]

如何在opencv中将图像从CV_8UC1转换为CV_32FC1类型?

如何在 OpenCV 中将图像读取为双倍?

在 OpenCV 中将 YUV 转换为 BGR 或 RGB

如何在 Python 中将 RGB 图像转换为灰度图像?