我有以下情况,我的内存映像以及存储到磁盘然后读回的内容不相等,我想了解为什么以及如何“解决”差异。
如果有人想知道为什么同时拥有内存和本地磁盘,因为我使用存储的图像通过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
之外,还没有清楚什么是内存中的内容以及写入/读取的内容/来自磁盘的情况有所不同。
答案 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
的不匹配问题。