Сравнение изображений с OpenCV - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь отслеживать показания на ЖК-дисплее с помощью OpenCV (и Picamera). Я снимаю каждую секунду и хочу, чтобы изображение было одинаковым как минимум три кадра (3 секунды). Просто чтобы избежать сценариев, в которых я бы анализировал изображение, когда есть выключатель света или что-то прерывает изображение.

Итак, я читаю три изображения подряд и вычисляю разницу между ними, печатая (img0, img1, img2 - три последовательных изображения в оттенках серого):

> print(max(diff(img0,img1), diff(img1,img2), diff(img0, img2)))

, где

> def diff(image1, image2):
>     return abs(image1-image2).mean()

Я также использовал функцию absdiff с похожими результатами. Но странно, что при отсутствии изменения изображения (видимого мне) значения составляют около 120-160. Но когда я выключаю свет, значение падает до 110, а затем поднимается до 220. И когда я приставляю палец к рамке, значение все равно может находиться в области 120-160. Я не могу понять реальную модель, которая имела бы большой смысл. Возможно, проблема в том, что возникает дрожание и множество различий в пикселях. Есть ли более умный способ сделать это? Я прилагаю несколько образцов фотографий. frame 1

frame 2

frame 3

1 Ответ

0 голосов
/ 03 ноября 2018

Эта проблема, вероятно, вызвана тем, что вы вычитаете изображения с типом uint8. Любые отрицательные числа будут округлены до высоких значений. Например,

> np.array([-3,-2,-1,0], dtype=np.uint8)
[253 254 255 0]

Так что любые пиксели, у которых image2 больше image1 в функции diff, будут иметь высокие значения. Вы можете сначала изменить их на тип float. Используя ваши первые два образца изображения:

> print(diff(img0, img1))
209.93
> img0 = img0.astype(float)
> img1 = img1.astype(float)
> print(diff(img0, img1))
3.85
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...