OpenCV拼图(多种形式,封装,使用,包括图片越界及缩放)

本文介绍了一种实用的图像拼接方法,支持多种拼接方式,包括保持长宽比及任意颜色填充,适用于不同场景需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果如图所示:(解决了拼图中存在的越界情况,支持任意颜色填充)



刷图片的时候拼个图真的是家常便饭,每次都要自己重新写一个,干脆抽了个空写了个头文件,放出来分享一下,也欢迎大家给出意见。


有四种使用形式:

1.不保持长宽比缩放,参数为cv::Rect

2.不保持长宽比缩放,参数为x,y,width,height  (其实就是Rect的四个参数)

3.保持长宽比,参数为cv::Point+缩放倍数

4.保持长宽比,参数为x,y+缩放倍数


=================================代码==================================

先来看看main函数:

#include"拼图.h"

int main() {

	cv::Mat 丁老板皂片 = cv::imread("Master_Ding.jpg");//读入丁老板的玉照作为背景
	/*自己新建一个画布当然也是可以的
	cv::Mat frame(800,800,CV_8UC3);
	frame = cv::Scalar(0);//让画布变成黑色
	*/
    //注意:拼接图片类型必须一样,
	cv::Mat 猪崽儿 = cv::imread("pig.jpg");

	
	cv::Mat 丁老板皂片_copy = 丁老板皂片.clone();
	montage(丁老板皂片_copy, 猪崽儿, cv::Point(320, 100),0.2,cv::Scalar(0,255,0));
	cv::imshow("正常地拼图", 丁老板皂片_copy);

	cv::Mat 丁老板皂片_copy2 = 丁老板皂片.clone();

	cv::Rect rect(500, 300, 100, 90);//猪崽儿摆放的区域
	cv::Scalar 填充颜色 = cv::Scalar(0, 0, 255);
	montage(丁老板皂片_copy2, 猪崽儿, rect,填充颜色);
	cv::imshow("超出范围了", 丁老板皂片_copy2);

	cv::waitKey(-1);
}


然后就是关键的  拼图.h

#pragma once
#include<opencv2/opencv.hpp>
#include<algorithm>

//不保持长宽比
void montage(cv::Mat &output, cv::Mat &input, cv::Rect rect,
	cv::Scalar color = cv::Scalar(0)) //如果拼图范围超过ouput那么自动用color颜色填充
{
	if (rect.x + rect.width > output.cols || rect.y + rect.height > output.rows) {
		//拼图超界限了,用color填充
		int cols = std::max(rect.x + rect.width, output.cols);
		int rows = std::max(rect.y + rect.height, output.rows);
		cv::Mat Bigger(rows, cols, output.type());
		Bigger = color;
		montage(Bigger, output, cv::Rect(0, 0, output.cols, output.rows), color);
		output = Bigger.clone();
	}

	if (rect.width != input.cols || rect.height != input.rows) {
		cv::Mat temp;
		resize(input, temp, cv::Size(rect.width, rect.height));
		temp.copyTo(output(rect));
	}
	else input.copyTo(output(rect));
}

void montage(cv::Mat &output, cv::Mat &input, int x, int y, int width, int height, cv::Scalar color = cv::Scalar(0)) {
	montage(output, input, cv::Rect(x, y, width, height));
}
//保持长宽比的情况
void montage(cv::Mat &output, cv::Mat &input, cv::Point location, double zoom_size = 1.0, cv::Scalar color = cv::Scalar(0)) {
	cv::Rect rect(location.x, location.y, input.cols*zoom_size, input.rows*zoom_size);
	montage(output, input, rect, color);
}
void montage(cv::Mat &output, cv::Mat &input, int x, int y, double zoom_size = 1.0, cv::Scalar color = cv::Scalar(0)) {
	cv::Rect rect(x, y, input.cols*zoom_size, input.rows*zoom_size);
	montage(output, input, rect, color);
}


这样好看一点,23333



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱铭德

五毛也是爱٩(●´৺`●)૭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值