由于OpenCV既是机器视觉库,也是图像处理库,给头像添加国旗,那自然是小菜一碟,下面就实现过程和大家分享一些openCV里图像处理函数。
1、读取头像图像和国旗图像
2、把国旗图像叠加到头像图像上
3、把叠加好的图像保存好
注意的地方:
1、国旗图像必须缩放到合适的大小,才能放到头像图像上
2、国旗图像缩放不能变形
所以就把国旗的宽度缩放至头像宽度的1/4,然后高度也按照同样的比例进行缩放。
resize函数在各个图像处理项目里都应用十分广泛。
函数调用:
C++:
void resize(InputArray src, OutputArray dst,
Size dsize, double fx=0, double fy=0,
int interpolation=INTER_LINEAR)
python:
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst
参数说明:
src - 原图
dst - 目标图像。当参数dsize不为0时,dst的大小为size;否则,它的大小需要根据src的大小,参数fx和fy决定。dst的类型(type)和src图像相同
dsize - 目标图像大小。当dsize为0时,它可以通过以下公式计算得出:
所以,参数dsize和参数(fx, fy)不能够同时为0。
fx - 水平轴上的比例因子。当它为0时,计算公式如下:
fy - 垂直轴上的比例因子。当它为0时,计算公式如下:
interpolation - 插值方法。共有5种:
1)INTER_NEAREST - 最近邻插值法
2)INTER_LINEAR - 双线性插值法(默认)
3)INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
4)INTER_CUBIC - 基于4x4像素邻域的3次插值法
5)INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值
1、python实现
# -*- coding: utf8 -*-
import cv2
# Step1:读取头像和国旗图像。
img_head = cv2.imread('head.jpg')
img_flag = cv2.imread('flag.jpg')
# Step2:把国旗叠加到头像上。
# Step2.1:获取头像和国旗宽度
w_head, h_head = img_head.shape[:2]
w_flag, h_flag = img_flag.shape[:2]
# Step2.2:根据宽度计算缩放比例
scale = w_head / w_flag / 4
# Step2.3:根据缩放比例缩放国旗
img_flag = cv2.resize(img_flag, (0, 0), fx=scale, fy=scale)
# Step2.4:获取缩放后国旗的新尺寸
w_flag, h_flag = img_flag.shape[:2]
# Step2.5:根据缩放后的尺寸叠加国旗到头像右下角
for c in range(0, 3):
img_head[w_head - w_flag:, h_head - h_flag:, c] = img_flag[:, :, c]
# Step3:保存叠加后的图像
cv2.imwrite('new_head.jpg', img_head)
2、C++实现
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
//Step1:读取头像和国旗图像。
Mat img_head = imread("head.jpg");
Mat img_flag = imread("flag.jpg");
Mat img_flag_resized;
//Step2:把国旗叠加到头像上。
//Step2.1:获取头像和国旗宽度
int w_head = img_head.cols;
int h_head = img_head.rows;
int w_flag = img_flag.cols;
int h_flag = img_flag.rows;
//Step2.2:根据宽度计算缩放比例
double scale = (double)w_head/w_flag/4;
//Step2.3:根据缩放比例缩放国旗
resize(img_flag,img_flag_resized,Size(),scale,scale,INTER_NEAREST);
//Step2.4:获取缩放后国旗的新尺寸
w_flag = img_flag_resized.cols;
h_flag = img_flag_resized.rows;
//Step2.5:根据缩放后的尺寸叠加国旗到头像右下角
Mat imageROI=img_head(Rect(w_head-w_flag,h_head-h_flag,w_flag,h_flag));
img_flag_resized.copyTo(imageROI);
//Step3:保存叠加后的图像
imwrite("new_head.jpg",img_head);
return 0;
}
其CmakeList.txt为:
cmake_minimum_required(VERSION 3.0)
project(test1)
find_package(OpenCV REQUIRED)
add_executable(test1 test1.cpp)
target_link_libraries(test1 ${OpenCV_LIBS})
扫描上方二维码关注“嵌入式案例Show”公众号,看更多嵌入式案例