从images数组创建单个图像

时间:2015-04-01 11:52:53

标签: c++ opencv image-processing opencv3.0

您好我正在尝试在opencv中从多个图像创建单个图像。 我使用的图像大小相同。

我所做的是将它们重塑为单行,然后尝试将它们与我的新图像合并在一起。

我创建了大小为2张图像的新图像并传递了数组,但我收到错误EXC_BAD_ACCESS(code = 1,address = ..)

注意:图像尺寸正确 单个图像的大小:[170569 x 1] new_image的大小:[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 个答案:

答案 0 :(得分:3)

Mat new_image;

vconcat(图像[0],图像[1],new_image);

答案 1 :(得分:2)

如果我理解得比你需要将相同大小的2个图像连接成一个Mat。我写了一个非常快速的代码来执行此任务。

U可以将函数的参数更改为指针,并添加其他处理程序以关注变体大小的图像。

#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;

}