1.背景
最近在做一点图像处理的事情,在做处理时的cv2遇到一些小坑,希望大家遇到的相关的问题可以注意!!
2. cv2.imwrite保存图像
cv2.imwrite(filename, img, [params])
filename
:需要写入的文件名,包括路径和文件名,以及期望的扩展名(例如,.jpg,.png,.bmp等)。img
:需要保存的图像数据。这通常是通过其他OpenCV函数(如cv2.imread()
或cv2.cvtColor()
等)获得的NumPy数组。params
:这是一个可选参数,用于指定JPEG或PNG格式的压缩级别等。对于其他格式,此参数将被忽略。默认值为空列表[]
。
cv2.imwrite('output.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 50])
将JPEG的压缩质量设置为50(最高质量为100),然后将图像保存为新的文件'output.jpg'。这样保存的图像将具有较低的质量和较小的文件大小。
需要注意的是,这种压缩方法是有损的,也就是说,压缩过程中会丢失一些图像信息。因此,压缩后的图像可能无法完全还原为原始图像。在实际应用中,需要根据需求和图像类型来权衡压缩质量和文件大小。
坑1:cv2.imshow显示白茫茫的问题
cv2.imwrite()
函数在保存图像时,通常会将图像数据的dtype(数据类型)转换为8位无符号整数类型(即dtype为uint8
),而cv2.imshow不会处理图像成uint8,例如模型推理出来是float32类型,如果用cv2.imshow显示灰度图像的话就会出现白茫茫一片!!!
cv2.imshow显示 | cv2.imwrite保存的图片 |
思路一:直接float32转uint8!!回答:可以!但效果不好
image = image.astype(np.uint8)
在轮廓边边的时候会出现锯齿!!!(图像中偏白的线条很明显)
思路二:先归一化再转uint8呢? 回答:可以!效果很好!!!
image = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX)
image = image.astype(np.uint8)
现在可以知道cv2.imwrite使用了归一化和类型转换
注意:使用cv2.imshow后面要跟着cv2.waitKey(0)或者下面的代码,不然会出现不显示的问题。
if cv2.waitKey(1) & 0xFF == ord('q'):
break
3. cv2保存视频
cap = cv2.VideoCapture('test.mp4') # 检查视频是否成功打开 if not cap.isOpened(): print("Error: Couldn't open the video file.") return # 获取视频的帧率 fps = cap.get(cv2.CAP_PROP_FPS) # 设置视频编码器并创建输出视频对象 fourcc = cv2.VideoWriter_fourcc(*'XVID') # 选择适当的编码器,例如'XVID', 'MJPG', 'MP4V', 等等 out = cv2.VideoWriter('output_file.avi', fourcc, fps, (352, 288), isColor=False) while cap.isOpened(): ret, frame = cap.read() # 读取下一帧 # 图片数据前处理 if not ret: break img = data_pre_processing(frame) compressed_data = sess.run(outputs_name, {input_name: img}) compressed_image = data_post_processing(compressed_data) compressed_image = cv2.normalize(compressed_image, None, 0, 255, cv2.NORM_MINMAX) compressed_image = compressed_image.astype(np.uint8) out.write(compressed_image) # 释放资源并关闭视频文件 cap.release() out.release()
坑2:保存灰度视频出错
我在数据后处理时使用了下面的代码,将rgb转成了灰度图像,但是cv2保存视频默认是rgb的,导致保存的视频只有几KB的错误视频。
cv2.cvtColor(compressed_image, cv2.COLOR_RGB2GRAY)
解决思路:查文档的api使用
cv2.VideoWriter中的
isColor参数
isColor=False
: 指定输出视频是否为彩色。isColor
被设置为False
,表示输出视频将是灰度的(即不是彩色的)。如果你希望输出彩色视频,应该将其设置为True
。默认是彩色的