Re[2]: Чем заменить NumPy операции на массивах в C++ и JS
От: Артём Австралия жж
Дата: 20.10.23 20:35
Оценка:
Здравствуйте, paradok, Вы писали:

P>https://www.codeconvert.ai/python-to-c++-converter


P>#include <iostream>

P>#include <opencv2/opencv.hpp>

P>int main() {

P> float scale = 1.0 / 255.0;
P> cv::Size shape(1, 1, 3);
P> cv::Mat mean = (cv::Mat_<float>(3, 1) << 0.485, 0.456, 0.406);
P> cv::Mat std = (cv::Mat_<float>(3, 1) << 0.229, 0.224, 0.225);

P> CV_Assert(img.type() == CV_32F);

P> cv::Mat normalizedImg = (img * scale — mean) / std;

P> return 0;

P>}

Спасибо за подсказку. Попытался это повторить на TS/JS — ничего не вышло . Конвертор из питона в ts и в js наконвертил тоже некомпилируемый код . Остался на медленном переборе пока что.
import * as nj from 'numjs';
declare var cv;
//...


const imageRGB = new cv.Mat();
cv.cvtColor(image, imageRGB, cv.COLOR_BGRA2RGB, 3);

const img = nj.array(imageRGB.data, 'float32').reshape(imageRGB.rows, imageRGB.cols, imageRGB.channels());

const [h, w, c] = img.shape;
// numpy: (img.astype('float32') * self.scale - self.mean) / self.std
for (let y = 0; y < h; ++y) {
  for (let x = 0; x < w; ++x) {
    for (let i = 0; i < c; ++i) {
      const originalUint8 = img.get(y, x, i);
      const normalisedFloat32 = (originalUint8 * this.scale - this.mean[i]) / this.std[i];
      img.set(y, x, i, normalisedFloat32);
    }
  }
}

return img;


Оба OpenCV и NumJS бросают на попытке операции на 2 массивах с разной shape. Возможно, NumPy под капотом размножает 1 пиксел (вектор) на всю shape чтоб совпадали размеры- хз.

Попробовать тоже для исходной картинки сделать такого же размера 2 маски одна mean, вторая std и тогда скормить в OpenCV?
Отредактировано 22.10.2023 3:34 Артём . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.