我使用的是opencv 3.1.0版本,带有zbar(截至本文的最新版本)和PIL(截至本文)
import zbar
import Image
import cv2
# create a reader
scanner = zbar.ImageScanner()
# configure the reader
scanner.parse_config('enable')
#create video capture feed
cap = cv2.VideoCapture(0)
while(True):
ret, cv = cap.read()
cv = cv2.cvtColor(cv, cv2.COLOR_BGR2RGB)
pil = Image.fromarray(cv)
width, height = pil.size
raw = pil.tostring()
# wrap image data
image = zbar.Image(width, height, 'Y800', raw)
# scan the image for barcodes
scanner.scan(image)
# extract results
for symbol in image:
# do something useful with results
print 'decoded', symbol.type, 'symbol', '"%s"' % symbol.data
# clean up
print "/n ...Done"
我不明白为什么这不起作用——它应该不断检查视频流当前帧中的二维码,如果它看到二维码,它就会解码并打印出里面的内容——我把打印出来的二维码举到我的网络摄像头前,但它不起作用,这表明我的相机打开了,有一个视频流正在发生,所以在while循环的某个地方出了问题
我以前尝试过,电脑上的qr码没有打印出来,它在上运行良好
我还试着让它用cv2.imshow("out",cv)
向我显示当前帧,但当我这样做时,程序只显示了一个大的灰色正方形,它应该显示视频流,然后它冻结了,所以我不得不杀死Netbeans。
zbar适用于灰度图像。将cv = cv2.cvtColor(cv, cv2.COLOR_BGR2RGB)
更改为cv = cv2.cvtColor(cv, cv2.COLOR_BGR2GRAY)
。
我猜你是在使用这个示例代码来构建你的程序。他们使用第15行的convert('L')
进行颜色到灰度的转换。