OpenCV imwrite()/ imread()是否以任何方式修改图像?

时间:2018-12-14 00:43:22

标签: python python-3.x numpy opencv matchtemplate

我有以下情况,我的内存映像以及存储到磁盘然后读回的内容不相等,我想了解为什么以及如何“解决”差异。

如果有人想知道为什么同时拥有内存和本地磁盘,因为我使用存储的图像通过OpenCV的滑动窗口对图像的匹配/识别进行了微调,而不必一直等待视频流显示我在寻找什么。

BGR帧来自通过ffmpeg像素格式的bgr24创建的视频流,然后像这样进行处理:

self.raw_image = self.pipe.stdout.read(self.byte_length * self.byte_width * self.byte_offset)
bgr_frame = np.frombuffer(self.raw_image, dtype=np.uint8).reshape((self.byte_width, self.byte_length, self.byte_offset))
cv2.imwrite("capture/rgb/Frame_%d.png", self.frame_num), bgr_frame, [cv2.IMWRITE_PNG_COMPRESSION, 0])

现在事情变得有趣了,bgr_frame被发送到另一个函数,该函数会切出感兴趣的区域,然后尝试像这样从图像库中将每个区域与lib_image进行匹配

res = cv2.matchTemplate(region, lib_image, 'cv2.TM_CCOEFF_NORMED')

res返回的bgr_frame的值徘徊在.86区域附近,该区域比读取相同图像的 .1 低这样从磁盘返回:

image = cv2.imread("%s/%s" % (input_directory, file))
image = image[:,:,::-1] # Flip BGR to RGB

通过相同的功能从磁盘中读取image,以使区域与库相匹配,结果将在 .96 范围内!

我想念什么? OpenCV文档没有提到对图像做任何事情,除了在我的情况下以PNG压缩以特定格式编码0之外,还没有清楚什么是内存中的内容以及写入/读取的内容/来自磁盘的情况有所不同。

1 个答案:

答案 0 :(得分:1)

CV2 imwrite像这样调用时对BGR2RGB的输出进行转换:

cv2.imwrite("capture/rgb/Frame_%d.png", self.frame_num), bgr_frame, [cv2.IMWRITE_PNG_COMPRESSION, 0])

这就是为什么在传递图像进行分析之前添加cv2.cvtColor(bgr_frame, cv2.COLOR_BGR2RGB)至少可以解决我所看到的颜色问题的原因,这也解释了为什么在CV2 imread上我必须将阵列翻转到使图像增益回到RGB;可能有一个CV2.xxxxx参数可以传递给imread,该参数将立即将图像读取为RGB,而无需进行任何数组操作。

image = cv2.imread("%s/%s" % (input_directory, file))
image = image[:,:,::-1] # Flip BGR to RGB

但是,在保存和加载与PNG相同的帧时,这仍然不能解决live流帧.86.96的不匹配问题。