从图像数组创建单个图像

Posted

技术标签:

【中文标题】从图像数组创建单个图像【英文标题】:Create a single image from images array 【发布时间】:2015-04-01 11:52:52 【问题描述】:

您好,我正在尝试从 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); 


【问题讨论】:

【参考方案1】:

垫 new_image;

vconcat(image[0],image[1],new_image);

【讨论】:

【参考方案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;

【讨论】:

嗨,我仍然收到同样的错误。谢谢你。在这行代码中 mergeMat.at<:vec3b>(j,i) = image2.at<:vec3b>(j,i); 我刚刚编辑并添加了完整的工作代码。 IT 在我的机器上运行没有任何错误 你好,把它们并排放置,我需要它们一个接一个。 我已更改代码以按照您的要求执行。 嗨,它添加了两次相同的图像,而不是合并 2 个不同的图像

以上是关于从图像数组创建单个图像的主要内容,如果未能解决你的问题,请参考以下文章

在 ffmpeg 中从单个图像创建特定持续时间的视频

使用 Ghostscript 从单个 JPG 文件创建 PDF - PDF 中的图像放置问题

如何从多个图像中构建单个图像作为一个圆圈?

在 Matlab 中使用蒙太奇创建图像数组时保持像素分辨率

如何保存从 numpy 数组创建的图像?

如何从图像文字数组中选择单个图像并将其保存为swift 5中的用户默认值