Opencv图像拼接

描述

两张图片,如何拼成一张图片

代码

主要有两种方法

我这里举个例子,假设我有一张图片,这张图片左边部分是a,右面部分是b

我想要的新图片,想要左边是原图像的b,右边是原图像的a,而a和b的尺寸和信息都不变,我的代码应该怎么写

我先贴一段模板吧,下面会有实际的例子讲解

cv::Mat inputImage;
cv::Mat outputImage;
// 选定第一帧图要放的位置:0, 0, width, height
CvRect rect = cvRect(0, 0, inputImage.cols, inputImage.rows);
// 从要输出的大图中,获取第一张图要放的位置区域的引用
cv::Mat dstMat = outputImage(rect);
// 将原始图拷贝至目标区域
inputImage.colRange(0, inputImage.cols).copyTo(dstMat);

1. 操作图片

cv::Mat frame; // 原图像,你需要自己加载
int width = frame.size().width;
int height = frame.size().height;

int problem_col = 511; // 左图的最右像素值

cv::Mat frame_needBe_left = frame(cv::Rect(problem_col+1, 0, width - problem_col-1, height-1)); // 需要放在左面的图
cv::Mat frame_needBe_right = frame(cv::Rect(0, 0, problem_col, height-1)); // 需要放在右面的图

cv::Mat frame_fix(height, width, CV_8UC3, cv::Scalar(255, 255, 255)); // 定义一张空白图

cv::Rect rect_left = cv::Rect(0, 0, width - problem_col-1, height-1); // 新图像左边尺寸
cv::Rect rect_right = cv::Rect(width - problem_col, 0, problem_col, height-1); // 新图像右边尺寸

cv::Mat dstMat_left = frame_fix(rect_left); // 从要输出的大图中,获取左图要放的位置区域的引用
frame_needBe_left.colRange(0, width - problem_col-1).copyTo(dstMat_left); // 将原始图拷贝至目标区域

cv::Mat dstMat_right = frame_fix(rect_right); // 从要输出的大图中,获取右图要放的位置区域的引用
frame_needBe_right.colRange(0, problem_col).copyTo(dstMat_right); // 将原始图拷贝至目标区域

这种操作的问题:拼接出来的图片,中间是有个分界线的,颜色和你定义的frame_fix是一样的,看起来像某一列的图像值没有被覆盖,但实际上代码的参数是正确的。我没有进一步研究,采用了下面的操作像素来拼接

2. 操作像素

由于上面的问题,我直接对目标图像的像素进行了操作。最终结果是正确的,只不过专业的来说,这样遍历像素的办法是费时的

cv::Mat frame; // 原图像,你需要自己加载
int width = frame.size().width;
int height = frame.size().height;

int problem_col = 511; // 左图的最优一个像素值

cv::Mat frame_needBe_left = frame(cv::Rect(problem_col+1, 0, width - problem_col-1, height-1)); // 需要放在左面的图
cv::Mat frame_needBe_right = frame(cv::Rect(0, 0, problem_col, height-1)); // 需要放在右面的图

cv::Mat frame_fix(height, width, CV_8UC3, cv::Scalar(255, 0, 255)); // 定义一张空白图

for (int i = 0; i < width; i++)
{
    for (int j = 0 ; j < height; j ++)
    {
        if (i <= width - problem_col-1)
        {
            frame_fix.at<cv::Vec3b>(j,i)[0] = frame_needBe_left.at<cv::Vec3b>(j,i)[0];
            frame_fix.at<cv::Vec3b>(j,i)[1] = frame_needBe_left.at<cv::Vec3b>(j,i)[1];
            frame_fix.at<cv::Vec3b>(j,i)[2] = frame_needBe_left.at<cv::Vec3b>(j,i)[2];
        }
        else
        {
            frame_fix.at<cv::Vec3b>(j,i)[0] = frame_needBe_right.at<cv::Vec3b>(j,i-width +problem_col)[0];
            frame_fix.at<cv::Vec3b>(j,i)[1] = frame_needBe_right.at<cv::Vec3b>(j,i-width +problem_col)[1];
            frame_fix.at<cv::Vec3b>(j,i)[2] = frame_needBe_right.at<cv::Vec3b>(j,i-width +problem_col)[2];
        }
    }
}   

你可能感兴趣的:(计算机视觉,opencv,计算机视觉)