gpt4 book ai didi

python - 使用 Python OpenCV 将实时视频流中检测到的二维码保存为图像

转载 作者:行者123 更新时间:2023-12-01 03:02:30 26 4
gpt4 key购买 nike

我正在使用 Python(3.7) 和 OpenCV 2 开发一个项目,在该项目中我必须检测二维码并将其保存为图像,我已成功完成检测部分但不知道如何保存二维码作为图像?

这是我迄今为止尝试过的:

检测部分代码:

while True:
frame = vs.read()
frame = imutils.resize(frame, width=400)
barcodes = pyzbar.decode(frame)

for barcode in barcodes:
(x, y, w, h) = barcode.rect
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
barcodeData = barcode.data.decode("utf-8")
barcodeType = barcode.type
text = "{}".format(barcodeData)
cv2.putText(frame, '', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

if barcodeData not in found:
csv.write("{}\n".format(barcodeData))
csv.flush()

found.clear()
found.add(barcodeData)

# Título do Frame
cv2.imshow("Live Stream Window", frame)
key = cv2.waitKey(1) & 0xFF

if key == ord("q"):
break

如何将检测到的区域(二维码)保存为图像?

Update: below is the updated code to svae image automatically, but this is not working.


while True:
frame = vs.read()
frame = imutils.resize(frame, width=400)
original = frame.copy()
barcodes = pyzbar.decode(frame)
barcode_num = 0
frame_dict = {'y': 0, 'w': 0, 'h': 0, 'x': 0}

for barcode in barcodes:
(x, y, w, h) = barcode.rect
print(f'{x}, {y}, {w}, {h}')
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
ROI = original[y:y + h, x:x + w]
frame_dict['y'] = y
frame_dict['x'] = x
frame_dict['h'] = h
frame_dict['w'] = w
barcode_num += 1
barcodeData = barcode.data.decode("utf-8")
print(barcodeData)
barcodeType = barcode.type
text = "{}".format(barcodeData)
cv2.putText(frame, '', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

if barcodeData not in found:
csv.write("{}\n".format(barcodeData))
csv.flush()

found.clear()
found.add(barcodeData)

cv2.imshow("Live Stream Window", frame)
key = cv2.waitKey(1) & 0xFF

if key == ord("c"):
print('c is pressed')
ROI = original[frame_dict['y']:frame_dict['y'] + frame_dict['h'],
frame_dict['x']:frame_dict['x'] + frame_dict['w']]
cv2.imwrite('barcode_{}.png'.format(barcode_num), ROI)
pass
if key == ord("q"):
break

最佳答案

假设 (x, y, w, h) = barcode.rect返回与 x,y,w,h = cv2.boundingRect(contour) 相同的值,这是从图像中裁剪 ROI 的可视化

-------------------------------------------
| |
| (x1, y1) |
| ------------------------ |
| | | |
| | | |
| | ROI | |
| | | |
| | | |
| | | |
| ------------------------ |
| (x2, y2) |
| |
| |
| |
-------------------------------------------

考虑 (0,0)作为图像的左上角,从左到右作为 x 方向,从上到下作为 y 方向。如果我们有 (x1,y1)作为左上角和 (x2,y2)作为 ROI 的右下角顶点,我们可以使用 Numpy 切片来裁剪图像:
ROI = image[y1:y2, x1:x2]

但通常我们不会有右下角的顶点。在典型情况下,我们将遍历轮廓,其中可以使用 cv2.boundingRect() 找到矩形 ROI 坐标。 .此外,如果我们想保存多个 ROI,我们可以保留一个计数器
cnts = cv2.findContours(grayscale_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

ROI_number = 0
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
ROI = image[y:y+h, x:x+w]
cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
ROI_number += 1

回到你的问题,这是我们如何做到的。请注意,我们复制了框架 original = frame.copy()因为一旦我们使用 cv2.rectangle 在图像上绘制,它将绘制到框架上。当我们裁剪它时,我们不想要这个绘制的框架,所以我们从框架的副本中裁剪。
while True:
frame = vs.read()
frame = imutils.resize(frame, width=400)
original = frame.copy()
barcodes = pyzbar.decode(frame)
barcode_num = 0

for barcode in barcodes:
(x, y, w, h) = barcode.rect
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
ROI = original[y:y+h, x:x+w]
cv2.imwrite('barcode_{}.png'.format(barcode_num), ROI)
barcode_num += 1
barcodeData = barcode.data.decode("utf-8")
barcodeType = barcode.type
text = "{}".format(barcodeData)
cv2.putText(frame, '', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

if barcodeData not in found:
csv.write("{}\n".format(barcodeData))
csv.flush()

found.clear()
found.add(barcodeData)

# Título do Frame
cv2.imshow("Live Stream Window", frame)
key = cv2.waitKey(1) & 0xFF

if key == ord("q"):
break

关于python - 使用 Python OpenCV 将实时视频流中检测到的二维码保存为图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60174088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com