Opencv图像拼接
程序员文章站
2022-05-16 10:36:38
...
描述
两张图片,如何拼成一张图片
代码
主要有两种方法
我这里举个例子,假设我有一张图片,这张图片左边部分是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];
}
}
}
上一篇: SVM实践之OPENCV模块