Как создать 4D матрицу из вектора матриц в OpenCV c ++ - PullRequest
0 голосов
/ 20 марта 2020

Предположим, что я собираю изображения / матрицы одинакового размера, глубины и канала в vector. Итак, эти изображения r*c*d каждое, и у меня есть m из них в моем векторе, как показано ниже.

vector<string> imgs; --> there are m image paths in these, all are r*c*d resolution
vector<Mat> vec;
for (auto img: imgs ){
    vec.push_back(cv::imread(img, COLOR_BGR)); //or gray. doesn't really matter
}

Теперь я хочу создать 4D матрицу. Например, в python np.array(vec) дал бы мне это (предполагая, что vec является списком). Мне бы хотелось того же в OpenCV c ++, но я не смог найти решения для этого.

Я не хочу создавать 4D матрицу с Mat m(dims, size, type);, затем выполнять итерацию по всем пикселям и копировать значение как это очень неэффективно. Я хотел бы иметь технику, которая будет просто рассматривать vec<Mat> как 4D Mat, так что она будет очень быстрой. Обратите внимание, что у меня могут быть 100 изображения с полным разрешением.

Я использую Opencv4.2 и c ++ для Ma c.

Заранее спасибо

1 Ответ

1 голос
/ 20 марта 2020

Сегодня, спустя много часов, я случайно нашел ответ на свой вопрос. Я оставлю здесь ответ, чтобы иметь ссылку для тех, кто борется с документацией OpenCV, чтобы найти правильный ответ.

vector<int> dims = {m, r, c}; //dimensions
cv::Mat m (3, &dims[0], imgs[0].type(), &imgs[0]);

Это создает матрицу 4D из вектора imgs, где тип является одним из CV_8UC1, CV_8UC3 или CV_8UC4 в зависимости от количества каналов. Хорошо, что он не копирует вектор.

Хотя это не является частью вопроса, для доступа к пикселю в матрице 4D вы можете сделать следующее:

int x = v1, i = v2, j = v3, c = v4; //v1-4 are some random values within their ranges
cout << (int)m.at<Mat>(x).at<Vec3b>(i,j)[c] << " " 
     << (int)imgs[x].at<Vec3b> (i,j)[c] << endl;

Оба будут печатать c -й канал i,j -го индекса x -го изображения.

...