OpenCV изменяет размер существенно разных результатов между python и javascript - PullRequest
1 голос
/ 29 мая 2020

В настоящее время я работаю над проектом, связанным с тепловыми изображениями, и мне нужно немного изменить размер полученного изображения. В настоящее время я изменяю размер на javascript (после отправки данных с веб-сервера), и это работает очень хорошо, к сожалению, новое требование означает, что мне нужно перенести это изменение размера на веб-сервер, используя python.

Я сделал это, но когда я изменяю размер, теперь я получаю «тройное перекрывающееся изображение», которого у меня нет на стороне javascript (см. Снимок экрана)

Python (рабочая версия)

nparr = np.frombuffer(temps, dtype=np.float32)
temparr = np.copy(nparr)
temparr *= (1.0/temparr.max())
// array comes in single dimension, reshapre to (width,height)
temps = temparr.reshape(int(temp_frame["width"]), int(temp_frame["height"]))
 socketio.emit("thermal_image", {'data':b''+bytearray(temps),'width':temps.shape[0], 'height':temps.shape[1]}, broadcast=True)

Javascript (рабочая версия)

let bytes = new Float32Array(msg.data);
let width = msg.width;
let height = msg.height;
var mat = cv.matFromArray(height, width, cv.CV_32FC1, bytes);
let dst_mat = new cv.Mat();
let dsize = new cv.Size(1000,1000);
cv.resize(mat, dst_mat, dsize,0,0,cv.INTER_AREA);
cv.imshow(canvas_name, dst_mat); 

И новый код python вместе с javascript, используемый для отображения Python (Нерабочая версия)

nparr = np.frombuffer(temps, dtype=np.float32)
temparr = np.copy(nparr)
temparr *= (1.0/temparr.max())
temps = temparr.reshape(int(temp_frame["width"]), int(temp_frame["height"]))
resized_temps = np.zeros((1000,1000), np.float32)
cv2.resize(temps, dsize=(1000,1000), dst=resized_temps, fx=0, fy=0,interpolation=cv2.INTER_AREA)
socketio.emit("thermal_image", {'data':b''+bytearray(resized_temps),
   'width':resized_temps.shape[0],
   'height':resized_temps.shape[1]},
   broadcast=True)

Javascript (нерабочая версия)

let bytes = new Float32Array(msg.data);
let width = msg.width;
let height = msg.height;
var mat = cv.matFromArray(height, width, cv.CV_32FC1, bytes);
cv.imshow(canvas_name, dst_mat);

Как видите, единственная разница в том, что изменение размера либо в javascript, либо python, и все же результаты находятся между действительно хорошими и практически бесполезными. Я знаю, что делаю что-то неправильно, но хоть убей не могу понять этого.

На изображениях изображен один и тот же человек, но в немного разных позах. На втором изображении используется python, движение все еще видно, и при правильном расположении объект в сцене можно увидеть .. 3 раза.

good_thermal bad_thermal

РЕДАКТИРОВАТЬ: изображения изменены на более четкие

1 Ответ

0 голосов
/ 30 мая 2020

Глупая ошибка, но на случай, если кто-то еще столкнется с ней после бессонного времени, как я, я опубликую ответ:

Я получал в данных сглаженный массив байтов, а затем менял его форму (ширина , рост). Это отлично сработало при изменении размера в javascript, поскольку я снова отправил сплющенный массив в javascript, и изменение размера было выполнено (высота, ширина). Вот как opencv принимает свои значения.

При переходе на python я забыл изменить форму на (высота, ширина) и вместо этого сохранил (ширина, высота). Поэтому, когда opencv изменил размер, мы интерполировали в неправильном направлении, что привело к появлению линий и повторяющихся изображений.

So Solution,

изменить строку temps = temparr.reshape(int(temp_frame["width"]), int(temp_frame["height"])) temps = temparr.reshape(int(temp_frame["height"]), int(temp_frame["width"]))

и вуаля, opencv отлично играет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...