效果如图所示:(解决了拼图中存在的越界情况,支持任意颜色填充)
刷图片的时候拼个图真的是家常便饭,每次都要自己重新写一个,干脆抽了个空写了个头文件,放出来分享一下,也欢迎大家给出意见。
有四种使用形式:
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