OpenCV imwrite () / imread (), любая функция изменяет изображение каким-либо образом? - PullRequest
0 голосов
/ 14 декабря 2018

У меня следующая ситуация, мой образ в памяти и то, что сохраняется на диск и затем считывается обратно, не равны, и я хотел бы понять, почему, а также как «исправить» разницу.

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

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

Однако это все еще не исправило моюплохое соответствие из live потокового кадра .86 против .96 при сохранении и загрузке того же кадра, что и PNG.

...