C++中怎么使用OpenCV制作哈哈镜图像效果
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍了C++中怎么使用OpenCV制作哈哈镜图像效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中怎么使用OpenCV制作哈哈镜图像效果文章都会有所收
千家信息网最后更新 2025年01月19日C++中怎么使用OpenCV制作哈哈镜图像效果
这篇文章主要介绍了C++中怎么使用OpenCV制作哈哈镜图像效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中怎么使用OpenCV制作哈哈镜图像效果文章都会有所收获,下面我们一起来看看吧。
一、凸透镜
制作凸透镜效果(将图像放大)。根据网上查找的变换公式:
图像放大:凸透镜
x = (dx / 2)*(sqrt(pow(dx, 2) + pow(dy, 2)) / r) + cx;
y = (dy / 2)*(sqrt(pow(dx, 2) + pow(dy, 2)) / r) + cy;
1.功能源码
请查看源码注释
bool Mirror_Magnify(Mat src){ /* 图像放大:凸透镜 x = (dx / 2)*(sqrt(pow(dx, 2) + pow(dy, 2)) / r) + cx; y = (dy / 2)*(sqrt(pow(dx, 2) + pow(dy, 2)) / r) + cy; */ Mat canvas = Mat::zeros(src.size(), src.type()); //画布,重新生成哈哈图像 //图像中心 int cx = src.cols / 2; int cy = src.rows / 2; //决定哈哈镜大小 int radius = 200; //图像像素修改 for (int i = 0; i < src.rows; i++) { for (int j = 0; j < src.cols; j++) { //任意像素点到图像中心距离 int dx = j - cx; int dy = i - cy; //重新映射像素点位置 int x = (dx / 2)*(sqrt(pow(dx, 2) + pow(dy, 2)) / radius) + cx; int y = (dy / 2)*(sqrt(pow(dx, 2) + pow(dy, 2)) / radius) + cy; for (int c = 0; c < 3; c++) { //防止越界 if ((x > 0 && x < src.cols) && (y > 0 && y < src.rows)) { canvas.at(i, j)[c] = src.at (y, x)[c]; } } } } imshow("Mirror_Magnify", canvas); return true;}
2.效果显示
二、凹透镜
制作凹透镜效果(将图像缩小)。根据网上查找的变换公式:
图像缩小:凹透镜
x = sqrt(sqrt(pow(dx, 2) + pow(dy, 2))) * compress * cos(atan2(dy, dx)) + cx;
y = sqrt(sqrt(pow(dx, 2) + pow(dy, 2))) * compress * sin(atan2(dy, dx)) + cy;
1.功能源码
请查看源码注释
bool Mirror_Narrow(Mat src){ /* 图像缩小:凹透镜 x = sqrt(sqrt(pow(dx, 2) + pow(dy, 2))) * compress * cos(atan2(dy, dx)) + cx; y = sqrt(sqrt(pow(dx, 2) + pow(dy, 2))) * compress * sin(atan2(dy, dx)) + cy; */ Mat canvas = Mat::zeros(src.size(), src.type());//画布,重新生成哈哈图像 int compress = 12; //压缩强度 //图像中心 int cx = src.cols / 2; int cy = src.rows / 2; //图像像素修改 for (int i = 0; i < src.rows; i++) { for (int j = 0; j < src.cols; j++) { //任意像素点到图像中心距离 int dx = j - cx; int dy = i - cy; //重新映射像素点位置 int x = sqrt(sqrt(pow(dx, 2) + pow(dy, 2))) * compress * cos(atan2(dy, dx)) + cx; int y = sqrt(sqrt(pow(dx, 2) + pow(dy, 2))) * compress * sin(atan2(dy, dx)) + cy; for (int c = 0; c < 3; c++) { //防止越界 if ((x > 0 && x < src.cols) && (y > 0 && y < src.rows)) { canvas.at(i, j)[c] = src.at (y, x)[c]; } } } } imshow("Mirror_Narrow", canvas); return true;}
2.效果显示
三、源码
#include#include using namespace std;using namespace cv;/* 哈哈镜实现原理:让图像像素扭曲,将像素重新进行映射 假设输入图像宽w,高h。图像中心点坐标(cx,cy),图像任意像素点(x,y)到中心点距离 dx=(x-cx),dy=(y-cy),变换半径r*/bool Mirror_Magnify(Mat src){ /* 图像放大:凸透镜 x = (dx / 2)*(sqrt(pow(dx, 2) + pow(dy, 2)) / r) + cx; y = (dy / 2)*(sqrt(pow(dx, 2) + pow(dy, 2)) / r) + cy; */ Mat canvas = Mat::zeros(src.size(), src.type()); //画布,重新生成哈哈图像 //图像中心 int cx = src.cols / 2; int cy = src.rows / 2; //决定哈哈镜大小 int radius = 200; //图像像素修改 for (int i = 0; i < src.rows; i++) { for (int j = 0; j < src.cols; j++) { //任意像素点到图像中心距离 int dx = j - cx; int dy = i - cy; //重新映射像素点位置 int x = (dx / 2)*(sqrt(pow(dx, 2) + pow(dy, 2)) / radius) + cx; int y = (dy / 2)*(sqrt(pow(dx, 2) + pow(dy, 2)) / radius) + cy; for (int c = 0; c < 3; c++) { //防止越界 if ((x > 0 && x < src.cols) && (y > 0 && y < src.rows)) { canvas.at (i, j)[c] = src.at (y, x)[c]; } } } } imshow("Mirror_Magnify", canvas); return true;}bool Mirror_Narrow(Mat src){ /* 图像缩小:凹透镜 x = sqrt(sqrt(pow(dx, 2) + pow(dy, 2))) * compress * cos(atan2(dy, dx)) + cx; y = sqrt(sqrt(pow(dx, 2) + pow(dy, 2))) * compress * sin(atan2(dy, dx)) + cy; */ Mat canvas = Mat::zeros(src.size(), src.type());//画布,重新生成哈哈图像 int compress = 12; //压缩强度 //图像中心 int cx = src.cols / 2; int cy = src.rows / 2; //图像像素修改 for (int i = 0; i < src.rows; i++) { for (int j = 0; j < src.cols; j++) { //任意像素点到图像中心距离 int dx = j - cx; int dy = i - cy; //重新映射像素点位置 int x = sqrt(sqrt(pow(dx, 2) + pow(dy, 2))) * compress * cos(atan2(dy, dx)) + cx; int y = sqrt(sqrt(pow(dx, 2) + pow(dy, 2))) * compress * sin(atan2(dy, dx)) + cy; for (int c = 0; c < 3; c++) { //防止越界 if ((x > 0 && x < src.cols) && (y > 0 && y < src.rows)) { canvas.at (i, j)[c] = src.at (y, x)[c]; } } } } imshow("Mirror_Narrow", canvas); return true;}int main(){ Mat src = imread("test.jpg"); if (src.empty()) { cout << "No Image!" << endl; system("pause"); return -1; } Mirror_Magnify(src); Mirror_Narrow(src); imshow("test", src); waitKey(0); system("pause");; return 0;}
关于"C++中怎么使用OpenCV制作哈哈镜图像效果"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"C++中怎么使用OpenCV制作哈哈镜图像效果"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
图像
像素
效果
哈哈镜
制作
凸透镜
凹透镜
源码
C++
点位
点到
画布
j++
生成
知识
变换
中心点
公式
内容
功能
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中国大学生网络安全排名
如何下载服务器所有txt文件
高级数据库管理员职责
来思网络技术有限公司
软件开发好还是计算机维护好
客户端与服务器经常连接不了
山东能源供应链服务软件开发商
软件开发综合实训目的
实况国际服数据库
如何快速找到数据库的隐藏文件
计算机网络技术的政策
香港服务器改装硬盘
软件开发中的工作量
北航网络安全多少分
桐乡乌镇乐点网络软件开发
网络安全销售经理面试评价
删了公司数据库
oracle数据库备份表
mooc网络技术与应用答案
安徽九移互联网科技有限公司
深圳网络安全工程师工资
大学生网络安全判断题及答案
广州乐开软件开发有限公司电话
把网络安全掌握在自己手里
车载网络技术的了解
美国化学会文献数据库
互联网络技术服务公司
一台服务器有多个不同的登录ip
网络安全应用技能
国开网络安全评估形考答案