我正在阅读两张图片并希望获得第三张图片,这只是两张图片的组合。 img_object和img_scene的大小不一样。
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;
}
答案 0 :(得分:6)
有一种非常简单的方法可以并排显示两个图像。可以使用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);
答案 1 :(得分:3)
// --------------------------------------------------------------
// 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;
}
答案 2 :(得分:2)
如果图像尺寸不同,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
构造函数),最后将每个图像复制到相应的一侧(这里我假设对象在向左,场景在右边):
Mat left_roi(combine, Rect(0, 0, img_object.size().width, img_object.size().height));
img_object.copyTo(left_roi);
Mat right_roi(combine, Rect(img_object.size().width, 0, img_scene.size().width, img_scene.size().height));
img_scene.copyTo(right_roi);
编辑:修正了TimZaman指出的拼写错误。
答案 3 :(得分:1)
您可以使用循环执行此操作,假设您的图像具有相同的大小:
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);
}
}
我没有对它进行过测试,但这就是你可以做到的方式
答案 4 :(得分:0)
我试图并排放置多张图片,试试吧。
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).copyTo(A.row(i));
不要这样做:
A.row(j) = A.row(i);