并排放置两个图像,opencv 2.3,c++;

并排放置两个图像,opencv 2.3,c++;,opencv,Opencv,我在看两张图片,想得到第三张,这是两张图片的组合。 img_对象和img_场景的大小不同 int main( int argc, char** argv ) Mat combine; Mat img_object = imread( object_filename, CV_LOAD_IMAGE_GRAYSCALE ); Mat img_scene = imread( scene_filename , CV_LOAD_IMAGE_GRAY

我在看两张图片,想得到第三张,这是两张图片的组合。
img_对象和img_场景的大小不同

    int main( int argc, char** argv )
        Mat combine;

        Mat img_object = imread( object_filename, CV_LOAD_IMAGE_GRAYSCALE );
        Mat img_scene = imread(  scene_filename , CV_LOAD_IMAGE_GRAYSCALE );
    if( !img_object.data || !img_scene.data )
      { std::cout<< " --(!) Error reading images " << std::endl; return -1; }


       namedWindow( "Display window oject", 0 );// Create a window for display.


       namedWindow( "Display window scene ", 0 );


       namedWindow( "Display window combine ", 0 );

       imshow( "Display window oject", img_object );
       imshow( "Display window scene", img_scene );   
       imshow( "Display window scene", combine );   
 waitKey(0);
  return 0;
  }
int main(int argc,char**argv)
垫式联合收割机;
Mat img_object=imread(对象文件名、CV_LOAD_IMAGE_灰度);
Mat img_scene=imread(场景文件名、CV_加载_图像_灰度);
如果(!img_object.data | |!img_scene.data)

{std::cout假设图像大小相同,可以通过循环执行此操作:

Mat combine = Mat::zeros(img_object.rows,img_object.cols *2,img_object.type());
for (int i=0;i<combine.cols;i++) {
    if (i < img_object.cols) {
         combine.col(i) = img_object.col(i);
    } else {
         combine.col(i) = img_scene.col(i-img_object.col);
    }
}
Mat combine=Mat::zeros(img_object.rows,img_object.cols*2,img_object.type());

对于(int i=0;i如果图像大小不同,
combine
的宽度将等于宽度之和,但高度必须是两个图像高度中较大的一个

按如下方式定义组合图像:

Mat combine(max(img_object.size().height, img_scene.size().height), img_object.size().width + img_scene.size().width, CV_8UC3);
请注意,我们只是创建了一个新的
Mat
对象,其高度等于图片的最大高度,宽度等于图片的组合宽度(如果您需要图片之间的小间距,您需要在此处进行说明)

然后,您可以为
combine
中的每一侧定义感兴趣的区域(使用方便的
Mat
构造函数),最后将每个图像复制到相应的一侧(这里我假设对象位于左侧,场景位于右侧):

编辑:修复了TimZaman指出的打字错误。

/--------------------------------------------------------------
// --------------------------------------------------------------
// Function to draw several images to one image.
// Small images draws into cells of size cellSize.
// If image larger than size of cell ot will be trimmed.
// If image smaller than cellSize there will be gap between cells.
// --------------------------------------------------------------
char showImages(string title, vector<Mat>& imgs, Size cellSize) 
{
char k=0;
    namedWindow(title);
    float nImgs=imgs.size();
    int   imgsInRow=ceil(sqrt(nImgs));     // You can set this explicitly
    int   imgsInCol=ceil(nImgs/imgsInRow); // You can set this explicitly

    int resultImgW=cellSize.width*imgsInRow;
    int resultImgH=cellSize.height*imgsInCol;

    Mat resultImg=Mat::zeros(resultImgH,resultImgW,CV_8UC3);
    int ind=0;
    Mat tmp;
    for(int i=0;i<imgsInCol;i++)
    {
        for(int j=0;j<imgsInRow;j++)
        {
            if(ind<imgs.size())
            {
            int cell_row=i*cellSize.height;
            int cell_col=j*cellSize.width;
            imgs[ind].copyTo(resultImg(Range(cell_row,cell_row+tmp.rows),Range(cell_col,cell_col+tmp.cols)));
            }
            ind++;
        }
    }
    imshow(title,resultImg);
    k=waitKey(10);
    return k;
}
//函数将多个图像绘制为一个图像。 //小图像绘制到大小为cellSize的单元格中。 //若图像大于单元格的大小,ot将被修剪。 //如果图像小于单元格大小,则单元格之间会有间隙。 // -------------------------------------------------------------- char showImages(字符串标题、向量和imgs、大小cellSize) { chark=0; 姓名(头衔); float nImgs=imgs.size(); int imgsInRow=ceil(sqrt(nImgs));//您可以显式地设置它 int-imgsInCol=ceil(nImgs/imgsInRow);//您可以显式地设置它 int-resultImgW=cellSize.width*imgsInRow; int resultImgH=单元格大小。高度*imgsInCol; Mat resultImg=Mat::零(resultImgH、resultImgW、CV_8UC3); int ind=0; Mat-tmp;
对于(inti=0;i我已经尝试将多个图像并排放置,只需尝试这个

Mat combine = Mat::zeros(img_buff[0].rows, 
img_buff[0].cols * (int)img_index.size(), img_buff[0].type());

int cols = img_buff[0].cols;
for (int i=0;i<combine.cols;i++) {
    int fram_index = i / img_buff[0].cols;
    cout<<fram_index<<endl;   
    img_buff[fram_index].col(i % cols).copyTo(combine.col(i));
}
imshow("matching plot", combine);
不要这样做:

A.row(j) = A.row(i);

有一种非常简单的方法可以并排显示两幅图像。可以使用opencv提供的以下功能

Mat image1, image2;
hconcat(image1,image2,image1);//Syntax-> hconcat(source1,source2,destination);
此函数还可用于将一组列从一个图像复制到另一个图像

Mat image;
Mat columns=image.colRange(20,30);
hconcat(image,columns,image);

img_对象和img_场景的大小不相同。您好,此方法不起作用,您不能执行A.row(j)=A.row(i);请尝试A.row(j).copyTo(A.row(i));按照您的代码,我得到0个错误。显示合并图像或保存,只得到一个黑色窗口。我没有得到图像。img_对象大小()。宽度应为img_对象。大小().width..我无法编辑您的帖子,因为stackoverflow希望至少更改6个字符,我的向量imgs中有12个帧。单个帧大小为176x144。我的程序在imgs[ind]处崩溃。复制到(resultImg(范围(单元格行,单元格行+tmp.rows),范围(单元格列,单元格列+tmp.cols)));用于第一次迭代。知道为什么吗?可能是您没有设置cellSize?谢谢。我正在将cellSize设置为与我的个人图像大小相等。它是176x144。它还假设vector中的图像具有CV_8UC3元素类型。请检查此项。这将有助于非常轻松地提高您的内容质量。我尝试过使用不同行数的hconcat,它崩溃了。工作正常只有在行数相同的情况下才能使用。但如果列数不同,则可以使用。对于可变行数,请使用vconcat函数。但在该函数中,列数必须相同。使用这些函数可以避免使用令人困惑的“For”循环。它必须具有相同的行数和相同的数据类型,但在其他方面效果很好。
Mat image1, image2;
hconcat(image1,image2,image1);//Syntax-> hconcat(source1,source2,destination);
Mat image;
Mat columns=image.colRange(20,30);
hconcat(image,columns,image);