树莓派系列二:openCV之头像添加国旗

树莓派系列二:openCV之头像添加国旗_第1张图片
由于OpenCV既是机器视觉库,也是图像处理库,给头像添加国旗,那自然是小菜一碟,下面就实现过程和大家分享一些openCV里图像处理函数。

实现过程

1、读取头像图像和国旗图像
2、把国旗图像叠加到头像图像上
3、把叠加好的图像保存好
注意的地方:
1、国旗图像必须缩放到合适的大小,才能放到头像图像上
2、国旗图像缩放不能变形
所以就把国旗的宽度缩放至头像宽度的1/4,然后高度也按照同样的比例进行缩放。

知识点介绍

1、resize()函数

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})

THE END

在这里插入图片描述
扫描上方二维码关注“嵌入式案例Show”公众号,看更多嵌入式案例

你可能感兴趣的:(树莓派,opencv,图像识别,计算机视觉)