使用 OpenCV 实现国庆渐变版的头像

简介: 使用 OpenCV 实现国庆渐变版的头像

国庆期间发现很多小伙伴的头像都换了,添加了国旗的效果,变得更加喜庆。


该效果看上去不难,用 OpenCV 几十行就可以实现了。


最简单的图像融合版本



先来一个最简单的图像融合版本,找一张头像以及一张标准国旗的图片,将找到的头像做裁剪,大小跟国旗的大小保持一致。


image.png

icon.jpg


然后,两张图片进行叠加

cv::Mat image = cv::imread("/Users/tony/Downloads/icon.jpg");
    cv::Mat flag = cv::imread("/Users/tony/Downloads/flag.png");
    cv::Mat roi,dst;
    cv::imshow("image",image);
    cv::imshow("flag",flag);
    roi = image(cv::Rect(300,400, flag.cols, flag.rows));
    cv::addWeighted(roi, 0.8, flag, 0.35, 0, dst);
    cv::imshow("dst",dst);


网络异常,图片无法展示
|

roi.png


渐变版本



刚才的效果一般,那我们再尝试一下渐变的版本。离红旗越近,红旗的权重越大。这样就可以实现渐变的效果。

cv::Mat image = cv::imread("/Users/tony/Downloads/icon.jpg");
    cv::Mat flag = cv::imread("/Users/tony/Downloads/flag.png");
    int flag_width = flag.cols;
    int flag_height = flag.rows;
    Mat roi = image(cv::Rect(450,1200, flag_width, flag_height));
    int radius = 0;
    if (flag_width > flag_height) {
        radius = flag_width;
    } else {
        radius = flag_height;
    }
    for (int i=0; i<roi.rows; i++) {
        for (int j=0;j<roi.cols;j++) {
            int distance = std::sqrt(i*i+j*j);
            double alpha;
            if (distance > radius) {
                alpha =  1;
            }  else {
                alpha = (double) distance / radius;
            }
            Vec3b v1 = roi.at<Vec3b>(i,j);
            roi.at<Vec3b>(i,j)[0]=alpha*v1[0] + (1-alpha)*flag.at<Vec3b>(i,j)[0];
            roi.at<Vec3b>(i,j)[1]=alpha*v1[1] + (1-alpha)*flag.at<Vec3b>(i,j)[1];
            roi.at<Vec3b>(i,j)[2]=alpha*v1[2] + (1-alpha)*flag.at<Vec3b>(i,j)[2];
        }
    }
    cv::imshow("dst",roi);


网络异常,图片无法展示
|

result.png


这次的效果,比第一次好多了:)。

btw,祝大家国庆节快乐!

相关文章
|
JavaScript 前端开发 UED
jQuery 自动刷新页面但不闪烁的实现方法
jQuery 自动刷新页面但不闪烁的实现方法
|
存储 SQL 缓存
使用实践:Hologres对接MaxCompute常见问题排查
本文总结了Hologres对接MaxCompute时的常见问题与处理方法。
4451 3
使用实践:Hologres对接MaxCompute常见问题排查
|
安全 定位技术 数据安全/隐私保护
域环境管理
域环境管理
1238 0
|
人工智能 边缘计算 自然语言处理
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
908 48
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
机器学习/深度学习 编解码 异构计算
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 ICCV 2023的EfficientViT 用于高分辨率密集预测的多尺度线性关注
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 ICCV 2023的EfficientViT 用于高分辨率密集预测的多尺度线性关注
1176 11
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 ICCV 2023的EfficientViT 用于高分辨率密集预测的多尺度线性关注
|
弹性计算 运维 Cloud Native
阿里云罗晶分享 | X86+ARM,容器服务 ACK 多架构应用部署最佳实践
2023年8月31日,系列课程第五节《X86+ARM,容器服务ACK多架构应用部署最佳实践》正式上线,由阿里云云原生应用平台产品专家罗晶主讲,内容涵盖:容器服务ACK简介;ACK支持倚天ARM实例;ACK多架构应用部署最佳实践。
|
人工智能 前端开发 搜索推荐
人工智能(AI)在前端设计中的创新应用
人工智能(AI)在前端设计中的创新应用
684 4
|
网络虚拟化 网络架构
不同网段通过静态路由实现互通
静态路由是一种需要管理员手工配置的特殊路由。静态路由比动态路由使用更少的带宽,并且不占用CPU资源来计算和分析路由更新。但是当网络发生故障或者拓扑发生变化后,静态路由不会自动更新,必须手动重新配置。静态路由有5个主要的参数:目的地址和掩码、出接口和下一跳、优先级。 使用静态路由的好处是配置简单、可控性高,当网络结构比较简单时,只需配置静态路由就可以使网络正常工作。在复杂网络环境中,还可以通过配置静态路由改进网络的性能,并且可以为重要的应用保证带宽。
941 0
不同网段通过静态路由实现互通
|
域名解析 网络协议 Linux
linux系统域名无法解析,提示Name or service not known
linux系统域名无法解析,提示Name or service not known

热门文章

最新文章