1

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

如果有人想知道为什么我同时拥有(内存和本地磁盘),那是因为我使用存储的图像来微调我的图像匹配/识别,使用 OpenCV 的滑动窗口,而无需不断等待视频流来显示我的内容正在寻找。

BGR 帧来自ffmpegbgr24像素格式创建的视频流,然后按如下方式处理:

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图像库中的 a 进行匹配,就像这样

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压缩,但显然内存中的内容和写入/读取到磁盘的内容有所不同。

4

1 回答 1

1

当像这样调用时, CV2imwrite会转换 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

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

于 2018-12-14T03:36:35.047 回答