当前位置:   article > 正文

Open CV拼接两张图片_opencv图片拼接

opencv图片拼接

一、概述

  案例:使用OpenCV将两张图片拼接成一张图片

  实现步骤:

    1.准备两张图片

    2.判断两张图片大小,使其高度一致(通过等比例缩放)

    3.创建一个空白的Mat矩阵,使其宽度=两张图片的宽度只和,高度=最小图片的高度

    4.将两张图片分别copy进新建的大图中

    5.完成

二、代码示例

  1. Video_Player_Splicing_Image::Video_Player_Splicing_Image(QWidget *parent)
  2. : QWidget{parent}
  3. {
  4. this->setWindowTitle("图像拼接");
  5. this->setFixedSize(320,480);
  6. QPushButton * chooseOneImageBtn = new QPushButton(this);
  7. chooseOneImageBtn->setText("选择第一张图片");
  8. QPushButton * chooseTwoImageBtn = new QPushButton(this);
  9. chooseTwoImageBtn->move(chooseOneImageBtn->x()+chooseOneImageBtn->width()+20,0);
  10. chooseTwoImageBtn->setText("选择第二张图片");
  11. QPushButton * submitBtn = new QPushButton(this);
  12. submitBtn->move(0,chooseOneImageBtn->y()+chooseOneImageBtn->height());
  13. submitBtn->setText("开始拼接");
  14. connect(chooseOneImageBtn,&QPushButton::clicked,[=](){
  15. chooseOneImage();
  16. });
  17. connect(chooseTwoImageBtn,&QPushButton::clicked,[=](){
  18. chooseTwoImage();
  19. });
  20. connect(submitBtn,&QPushButton::clicked,[=](){
  21. showResultImage();
  22. });
  23. }
  24. void Video_Player_Splicing_Image::chooseOneImage(){
  25. oneImagePath = QFileDialog::getOpenFileName(this,"选择图像","/Users/yangwei/Downloads/","Image File(*.jpg *.jpeg *.png *.bmp)");
  26. qDebug()<<oneImagePath;
  27. }
  28. void Video_Player_Splicing_Image::chooseTwoImage(){
  29. twoImagePath = QFileDialog::getOpenFileName(this,"选择图像","/Users/yangwei/Downloads/","Image File(*.jpg *.jpeg *.png *.bmp)");
  30. qDebug()<<twoImagePath;
  31. }
  32. void Video_Player_Splicing_Image::showResultImage(){
  33. Mat oneMat = imread(oneImagePath.toStdString().c_str());
  34. Mat twoMat = imread(twoImagePath.toStdString().c_str());
  35. if(oneMat.empty()){
  36. qDebug()<<"第一张图片不能为空";
  37. return;
  38. }
  39. if(twoMat.empty()){
  40. qDebug()<<"第二张图片不能为空";
  41. return;
  42. }
  43. imshow("src_one",oneMat);
  44. imshow("src_two",twoMat);
  45. int width = oneMat.cols;
  46. int height = oneMat.rows;
  47. int width2 = width;
  48. //等比缩放图片
  49. if(oneMat.rows>twoMat.rows){//如果第一张图片比第二章图片高
  50. height = twoMat.rows;
  51. width = oneMat.rows*((float)twoMat.cols/(float)oneMat.cols);//等比缩放
  52. cv::resize(oneMat,oneMat,Size(width,height));
  53. }else if(oneMat.rows<twoMat.rows){//第一张图片比第二章图片低
  54. width2 = twoMat.cols*((float)oneMat.rows/(float)twoMat.rows);//等比缩放
  55. cv::resize(twoMat,twoMat,Size(width2,height));
  56. }
  57. //开始拼接图片
  58. Mat dst;
  59. dst.create(height,width+width2,oneMat.type());//创建一个大的矩阵用于存放两张图像
  60. //将第一张图和第二张图摆放在合适的位置
  61. Mat roi1 = dst(Rect(0,0,width,height));
  62. oneMat.copyTo(roi1);
  63. Mat roi2 = dst(Rect(width,0,width2,height));
  64. twoMat.copyTo(roi2);
  65. imshow("dst",dst);
  66. }

三、演示图片

 本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号