基于OpenCV与Tkinter的人脸识别工具画框问题求助
解决OpenCV人脸识别中绘制矩形框的参数错误问题
问题根源
photo1是PIL.ImageTk.PhotoImage类型对象,并非OpenCV要求的numpy数组格式,cv2.rectangle只能处理OpenCV原生图像格式- 直接用
frame_rgb无效是因为操作顺序错误:你先把未画框的frame_rgb转成PhotoImage显示,之后再画框的操作不会同步到已显示的图像上
修正方案
先在OpenCV格式的图像上完成人脸矩形框绘制,再将处理后的图像转换为Tkinter可用的PhotoImage对象。修正后的代码如下:
print('hello world') import cv2 import PIL.Image, PIL.ImageTk import tkinter as tk face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') def update_camera1(): global photo1 if camera1_active: ret, frame = cap1.read() if ret: frame = cv2.resize(frame, (int(w*0.5), int(h*0.498))) frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(frame_gray, 1.3, 5) # 在OpenCV原生BGR图像上绘制人脸矩形框 for (x, y, width, height) in faces: # OpenCV用BGR颜色空间,(0, 0, 255)对应红色 cv2.rectangle(frame, (x, y), (x+width, y+height), (0, 0, 255), 3) # 转换为RGB格式后生成PhotoImage用于Tkinter显示 frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) photo1 = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(frame_rgb)) canvas.create_image(0, 0, image=photo1, anchor=tk.NW) root.after(10, update_camera1)
关键说明
- 绘制矩形框的操作必须在**OpenCV原生图像(numpy数组)**上执行,也就是未转换为PIL格式的
frame对象 - 完成绘制后再将图像从BGR转成RGB格式,最后生成
PhotoImage对象更新画布,这样画框效果才会显示出来 - 注意颜色参数:OpenCV默认使用BGR颜色空间,若要显示红色,需传入
(0, 0, 255)而非RGB的(255, 0, 0)
内容的提问来源于stack exchange,提问作者Markuss Celms
相关产品推荐
相关产品推荐

