【计算机视觉】OPENCV对于有alpha通道的透明背景图片的读取和图片叠加
这个是我自己做的粗略的螺旋丸的图,导出为png并带有alpha通道。
最后和一只狗合成成这个样子。
效果还是可以的。
为了实现这个效果,首先我们要明白具有透明通道的图片的OpenCV的读取方式。在OpenCV里,正常是读取图像和写入图像默认都是忽略透明通道的,如果想要读取原图像中的透明通道,则在使用imread()函数时,后面的参数要使用CV_LOAD_IMAGE_UNCHANGED参数或是直接写-1也可以。比如:
Mat inimg = imread("dog.png", CV_LOAD_IMAGE_UNCHANGED); // 读取透明通道
// 输出RGBA数值
cout << (int)inimg.at<Vec4b>(0,0)[0] << endl
<< (int)inimg.at<Vec4b>(0,0)[1] << endl
<< (int)inimg.at<Vec4b>(0,0)[2] << endl
<< (int)inimg.at<Vec4b>(0,0)[3] << endl;
这样我们读取的图片就有了四个通道,也就是BGRA四个通道,第四个就是Alpha通道,这个通道通过0-255的数值来代表该像素的透明度。
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int cvAdd4cMat_q(cv::Mat &dst, cv::Mat &scr, double scale);
int main()
{
char str[16];
Mat img1 = imread("bk.jpg"), img2 = imread("img.png", -1);
Mat img1_t1(img1, cvRect(0, 0, img2.cols, img2.rows));
cvAdd4cMat_q(img1_t1,img2,1.0);
imshow("final",img1);
waitKey(0);
return 0;
}
int cvAdd4cMat_q(cv::Mat &dst, cv::Mat &scr, double scale)
{
if (dst.channels() != 3 || scr.channels() != 4)
{
return true;
}
if (scale < 0.01)
return false;
std::vector<cv::Mat>scr_channels;
std::vector<cv::Mat>dstt_channels;
split(scr, scr_channels);
split(dst, dstt_channels);
CV_Assert(scr_channels.size() == 4 && dstt_channels.size() == 3);
if (scale < 1)
{
scr_channels[3] *= scale;
scale = 1;
}
for (int i = 0; i < 3; i++)
{
dstt_channels[i] = dstt_channels[i].mul(255.0 / scale - scr_channels[3], scale / 255.0);
dstt_channels[i] += scr_channels[i].mul(scr_channels[3], scale / 255.0);
}
merge(dstt_channels, dst);
return true;
}
【计算机视觉】OPENCV对于有alpha通道的透明背景图片的读取和图片叠加的更多相关文章
- 【Unity Shaders】Transparency —— 使用alpha通道创建透明效果
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- OpenCV【2】---读取png图片显示到QT label上的问题
问题一: 操作图片test.png是一个365x365的PNG图片 通过OpenCV自带的GUI显示出来图像是没问题的,例如以下操作代码所看到的: QStringfileName=QFileD ...
- php 处理透明背景的图片时的问题
PHP图象处理之透明背景的gif和png图片的一些问题 1,直接读取有透明背景的PNG格式文件,然后直接输出,背景变成了黑色,gif则没有这种情况. 解决方法:使用 imagesavealpha ...
- 关于Opengl中将24位BMP图片加入�一个alpha通道并实现透明的问题
#include <windows.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h& ...
- 关于Opengl中将24位BMP图片加入一个alpha通道并实现透明的问题
#include <windows.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h& ...
- 什么是Alpha通道?
图像处理(Alpha通道,RGB,...)祁连山(Adobe 系列教程)****的UI课程 一个也许很傻的问题,在图像处理中alpha到底是什么? Alpha通道是计算机图形学中的术语,指的是特别的 ...
- ImagXpress中如何修改Alpha通道方法汇总
ImagXpress支持处理Alpha通道信息来管理图像的透明度,Alpha通道支持PNG ,TARGA和TIFF文件,同时还支持BMP和ICO文件.如果说保存的图像样式不支持Alpha通道,就将会丢 ...
- 窗体的Alpha通道透明色支持(一旦 Form 被定义为利用 LayeredWindow ,窗口的绘图不再响应沿用多年的 WM_Paint 消息)
参考: http://www.delphibbs.com/delphibbs/dispq.asp?lid=2190768 Windows 2000后,为了支持类似MAC界面的Alpha通道混合效果,提 ...
- Alpha通道
Alpha通道是计算机图形学中的术语,指的是特别的通道,意思是“非彩色”通道,主要是用来保存选区和编辑选区.真正让图片变透明的不是Alpha 实际是Alpha所代表的数值和其他数值做了一次运算 为 ...
随机推荐
- JS 导出网页中Table内容到excel
<html> <head> <script type="text/javascript" language="javascript" ...
- 6、transformation和action1
一.transformation和action入门 1.介绍 Spark支持两种RDD操作:transformation和action.transformation操作会针对已有的RDD创建一个新的R ...
- zabbix(9)iterms(监控项)
一.iterms key 监控项按参数来分有两种:带参数和不带参 按定义来分:zabbix自带和用户自定义 1)Key可以带参数,该参数为一个数组列表,可以同时传递多个参数,Key的格式如下: 既Ke ...
- yum安装错误记录
原因:使用yum安装libvirt以后,后续没有使用yum -remove 包名去移除这个包,接着使用源码安装了libvirt服务,当我卸载源码安装的libvirt以后,通过yum重新安装libvir ...
- KCF追踪方法流程原理
读"J. F. Henriques, R. Caseiro, P. Martins, J. Batista, 'High-speed tracking with kernelized cor ...
- CSAW Quals CTF 2017-scv
目录 程序基本信息 程序漏洞 整体思路 exp脚本 内容参考 程序基本信息 64位动态链接程序,开启了栈溢出和数据段不可执行保护 程序漏洞 read函数很明显的栈溢出漏洞 整体思路 由于题目给了lib ...
- 性能测试工具gperftools使用
https://blog.csdn.net/10km/article/details/83820080 https://blog.51cto.com/wulingdong/2043898 https: ...
- mac使用vnc远程登录ubuntu16.04桌面
mac使用vnc远程登录ubuntu16.04桌面 1.安装在Ubuntu上安装x11vnc,如下: sudo apt-get install x11vnc 2.配置vnc密码 x11vnc -sto ...
- vue elementUI 表单校验(多层嵌套)
<template> <el-form :model="formData" :rules="formRule" ref="formD ...
- angular中的动态路由
1.配置动态路由 const routes: Routes = [ {path: 'home', component: HomeComponent}, {path: 'news', component ...