Python函数图像传递接收问题:cv2.imshow报TypeError错误
解决cv2.imshow抛出TypeError: Expected cv::UMat for argument 'mat'的问题
嘿,这个问题其实一眼就能找到症结!咱们先拆解下错误原因:
你的stills函数返回的是包含两个图像的元组:(sub_frame, final),但当你调用cv2.imshow('frame', something)时,something就是这个元组——而cv2.imshow的第二个参数需要的是单个图像矩阵(也就是numpy数组,对应OpenCV里的cv::UMat类型),直接传元组当然会触发类型错误啦。
解决方法分两种场景:
场景1:你只想显示函数返回的某一张图像
直接从元组里取出对应的元素即可,比如:
# 调用函数 something = stills("abc.jpg") # 显示人脸子图(sub_frame) cv2.imshow('face subframe', something[0]) cv2.waitKey() # 或者显示带框的完整图(final) cv2.imshow('full image with boxes', something[1]) cv2.waitKey()
场景2:你想获取并显示所有检测到的人脸子图
那你函数里注释掉的sub_frames列表就派上用场了,修改函数和调用逻辑如下:
def stills(user_image): sub_frames = [] # 取消注释,用来存所有人脸子图 fqp_image_src = user_image raw_pic = cv2.imread(fqp_image_src) mpic = cv2.resize(raw_pic,(0,0), fx=0.30, fy=0.30) mpic_rgb = cv2.cvtColor(mpic, cv2.COLOR_BGR2RGB) face_boxes = haar_cascade_face.detectMultiScale(mpic_rgb, scaleFactor = 1.2, minNeighbors = 5) final = mpic.copy() # 提前复制原图,避免循环里反复修改同一变量 for face_box in face_boxes: # 画框到复制后的图上 final = cv2.rectangle(final, (face_box[0], face_box[1]), ((face_box[0]+face_box[2]),(face_box[1]+face_box[3])), (0,255,0),2) sub_frame = final[face_box[1]:(face_box[1]+face_box[3]), face_box[0]:(face_box[0]+face_box[2])] sub_frames.append(sub_frame) # cv2.imshow('frame', sub_frame) # 可保留内部预览,也可去掉 # cv2.waitKey() return (sub_frames, final) # 调用并显示所有人脸 something = stills("abc.jpg") face_subframes = something[0] full_img = something[1] # 先显示带框的完整图 cv2.imshow('full image', full_img) cv2.waitKey() # 循环显示每一张人脸子图 for idx, face in enumerate(face_subframes): cv2.imshow(f'face {idx+1}', face) cv2.waitKey()
另外补充个小细节:你原来的循环里每次都用final = cv2.rectangle(mpic,...),其实会反复修改原始的mpic,提前用final = mpic.copy()可以避免破坏原图哦。
内容的提问来源于stack exchange,提问作者JubG
相关产品推荐
相关产品推荐

