Создать одно изображение из массива изображений

Привет, я пытаюсь создать одно изображение из нескольких изображений в opencv.
Изображения, которые я использую, имеют одинаковый размер.

то, что я делаю — это изменяю их в одну строку, а затем пытаюсь объединить их с моим новым изображением.

Я создаю новое изображение размером 2 изображения и передаю массив, но получаю ошибку EXC_BAD_ACCESS (code = 1, address = ..)

примечание: размеры изображений правильные
размер одного изображения: [170569 x 1] размер нового изображения: [170569 x 2]

мой код ниже.
благодарю вас

int main(){Mat image[2];
image[0]= imread("image1.jpg",0);

image[1]= imread("image2.jpg",0);image[0] = image[0].reshape(0, 1); //SINGLE LINE
image[1] = image[1].reshape(0, 1); //SINGLE LINE

int size = sizeof(image)/sizeof(Mat);Mat new_image(image[0].cols,size,CV_32FC1,image);

}

2

Решение

Если я хорошо понимаю, то вам нужно объединить 2 изображения одинакового размера в один мат. Я написал это очень быстрый код для выполнения этой задачи.

Вы можете изменить аргумент функции на указатель и добавить другие обработчики, чтобы заботиться об изображении варианта размера.

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

cv::Mat cvConcatenateMat(const cv::Mat &image1, const cv::Mat &image2, bool isCol CV_DEFAULT(true)){
if (isCol) {
cv::Mat mergeMat = cv::Mat(image1.rows, image1.cols + image2.cols, image1.type());
for (int j = 0; j < image1.rows; j++) {
for (int i = 0; i < image1.cols; i++) {
mergeMat.at<cv::Vec3b>(j,i) = image1.at<cv::Vec3b>(j,i);
}
for (int i = image1.cols; i < mergeMat.cols; i++) {
mergeMat.at<cv::Vec3b>(j,i) = image2.at<cv::Vec3b>(j,i);
}
}
return mergeMat;
} else {
cv::Mat mergeMat = cv::Mat(image1.rows + image2.rows, image1.cols, image1.type());
for (int j = 0; j < image1.cols; j++) {
for (int i = 0; i < image1.rows; i++) {
mergeMat.at<cv::Vec3b>(i,j) = image1.at<cv::Vec3b>(i,j);
}
for (int i = image1.rows; i < mergeMat.rows; i++) {
mergeMat.at<cv::Vec3b>(i,j) = image2.at<cv::Vec3b>(i-image1.rows,j);
}
}
return mergeMat;
}
}

int main(int argc, const char * argv[]) {

cv::Mat image1 = cv::imread("img1.jpg");
cv::Mat image2 = cv::imread("img2.jpg");
cv::resize(image2, image2, image1.size());cv::Mat outImage = cvConcatenateMat(image1, image2, false);

cv::imshow("out image", outImage);
cv::waitKey(0);
return 0;

}

2

Другие решения

Mat new_image;

vconcat (изображение [0], изображение [1], new_image);

3

По вопросам рекламы [email protected]