У меня следующая ситуация, мой образ в памяти и то, что сохраняется на диск и затем считывается обратно, не равны, и я хотел бы понять, почему, а также как «исправить» разницу.
Если кто-то хочет знать, почему у меня есть оба (в памяти и на локальном диске), потому что я использовал сохраненные изображения для точной настройки сопоставления / распознавания своих изображений, используя скользящее окно 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
, и, тем не менее, ясно, что находится в памяти и что записывается / читается на / с диска, отличается.