C++ OpenCV制作哈哈镜图像效果

目录
  • 前言
  • 一、凸透镜
    • 1.功能源码
    • 2.效果显示
  • 二、凹透镜
    • 1.功能源码
    • 2.效果显示
  • 三、源码

前言

本文将使用OpenCV C++ 制作哈哈镜图像。其实原理很简单,就是让图像像素扭曲,将像素重新进行映射。

一、凸透镜

制作凸透镜效果(将图像放大)。根据网上查找的变换公式:

图像放大:凸透镜

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<Vec3b>(i, j)[c] = src.at<Vec3b>(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<Vec3b>(i, j)[c] = src.at<Vec3b>(y, x)[c];
				}
			}
		}
	}

	imshow("Mirror_Narrow", canvas);

	return true;
}

2.效果显示

三、源码

#include<iostream>
#include<opencv2/opencv.hpp>
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<Vec3b>(i, j)[c] = src.at<Vec3b>(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<Vec3b>(i, j)[c] = src.at<Vec3b>(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哈哈镜图像内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ OpenCV技术实战之身份证离线识别

    目录 总体思路 图像的预处理 主要代码 实现效果 OpenCV身份证离线识别技术的主要技术就是通过OpenCV找到身份证号码区域,然后通过OCR进行数字识别该区域的截图即可得到身份证号码.本地ORC使用tess-two来完成,Tesseract是C++实现的OCR引擎,在Android中使用不是很方便,需要封装JavaAPI才能在Android平台中进行调用,然而tess-two已经帮我们做好了这些事情,通过集成tess-two就可以很方便的完成文字识别. 总体思路 图像的预处理 1.无损压缩

  • C++ OpenCV实战之图像全景拼接

    目录 前言 一.OpenCV Stitcher 1.功能源码 2.效果 二.图像全景拼接 1.特征检测 2.计算单应性矩阵 3.透视变换 4.图像拼接 5.功能源码 6.效果 三.源码 总结 前言 本文将使用OpenCV C++ 进行图像全景拼接.目前使用OpenCV对两幅图像进行拼接大致可以分为两类. 一.使用OpenCV内置API Stitcher 进行拼接. 二.使用特征检测算法匹配两幅图中相似的点.计算变换矩阵.最后对其进行透视变换就可以了. 一.OpenCV Stitcher imag

  • C++ OpenCV绘制简易直方图DrawHistImg

    目录 需求说明 具体流程 功能函数 C++测试代码 测试效果 需求说明 在对图像进行处理时,经常会有这类需求:想要观察图像的直方图分布,例如灰度图中0-255区间数值的分布情况,从而可以进行后续的操作,如阈值分割二值化.直方图均衡化等等.本文设计了一个能绘制简易直方图的简单函数DrawHistImg,可以帮助大家快速掌握绘制的原理,可以根据自己的创意对其进行改善和补充. 下面介绍具体实现流程. 具体流程 1)取图像的灰度图,并遍历统计0-255各个灰度值所出现的次数. cv::Mat src =

  • C++ OpenCV绘制几何图形

    本文实例为大家分享了C++ OpenCV绘制几何图形的具体代码,供大家参考,具体内容如下 绘制几何图形 直线 矩形 多边形 圆形 椭圆 文字 API 直线 CV_EXPORTS_W void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0); 矩形 CV_EXPORTS_W void recta

  • C++ OpenCV模拟实现微信跳一跳

    目录 前提精要: 实机演示Gif: 思路: 获取小黑人的位置: 获取终点的位置: 需要自定义的: 完整项目: 项目结构 pch.h main.cpp  前提精要: 本程序参考了大量的大佬佬的代码,在此基础之上,改编而成.而且其实代码写的奇差无比,很容易就挂了.然后呢,这里只是稍微提供一些思路,作为参考,就酱. 本程序依赖adb.exe和opencv425库. 本程序还有待优化,很渣很糟糕~ 仅供学习交流使用,切勿使用在违规违法的环境之中. 实机演示Gif: 思路: 获取小黑人的位置,获得目标方块

  • C++ OpenCV实现图像双三次插值算法详解

    目录 前言 一.图像双三次插值算法原理 二.C++ OpenCV代码 1.计算权重矩阵 2.遍历插值 3. 测试及结果 前言 近期在学习一些传统的图像处理算法,比如传统的图像插值算法等.传统的图像插值算法包括邻近插值法.双线性插值法和双三次插值法,其中邻近插值法和双线性插值法在网上都有很详细的介绍以及用c++编写的代码.但是,网上关于双三次插值法的原理介绍虽然很多,也有对应的代码,但是大多都不是很详细.因此基于自己对原理的理解,自己编写了图像双三次插值算法的c++ opencv代码,在这里记录一

  • C++ OpenCV制作哈哈镜图像效果

    目录 前言 一.凸透镜 1.功能源码 2.效果显示 二.凹透镜 1.功能源码 2.效果显示 三.源码 前言 本文将使用OpenCV C++ 制作哈哈镜图像.其实原理很简单,就是让图像像素扭曲,将像素重新进行映射. 一.凸透镜 制作凸透镜效果(将图像放大).根据网上查找的变换公式: 图像放大:凸透镜 x = (dx / 2)*(sqrt(pow(dx, 2) + pow(dy, 2)) / r) + cx; y = (dy / 2)*(sqrt(pow(dx, 2) + pow(dy, 2)) /

  • Python+OpenCv制作证件图片生成器的操作方法

    本项目使用Python和OpenCv实现身份证图片生成工具,填入信息,选择一张头像图片(即可生成黑白和彩色身份证图片).可以选择是否自动抠图,自动抠图目前仅支持蓝色背景,对自动抠图效果不满意可以手动抠图. 在线抠图地址: https://burner.bonanza.com/ https://www.gaoding.com/koutu 参照标准: 正面 "姓名"."性别"."民族"."出生年月日"."住址"

  • 超详细注释之OpenCV制作图像Mask

    这篇博客将介绍如何使用OpenCV制作Mask图像掩码.使用位运算和图像掩码允许我们只关注图像中感兴趣的部分,截取出任意区域的ROIs. 应用: 图像感兴趣区域的截取: 图像融合:构建透明的叠加层: 1. 效果图 原始图如下:(老九门颖宝&佛爷~) 矩形掩码 VS 效果图如下:(使用矩形掩码,只提取图像中包含人物的区域,而忽略其他区域) 圆形掩码 VS 效果图如下:(圆形掩模显示在左边,掩模的应用在右边.实质上可以使用任意形状的掩码图像,如矩形.圆.线.多边形等从图像中提取区域) 2. 源码 #

  • 基于Opencv制作的美颜相机带你领略美颜特效的效果

    目录 导语 正文 总结 导语 ​现在每一次出门,女友就喜欢拍照!BUT 嫌弃我给拍的照片角度不对,采光不好....... ​ 总之一大堆理由,啥时候让我拍照的水平能有美颜相机三分之一的效果就好!​ 果然都是锻炼出来的,至少现在我能看出来朋友圈哪些小姐姐批没批过照片.​ ​​ ​逃不掉​ ​逃不掉啊,为了摆脱这种局面-- 立马给女友写了一款简易版本的美颜相机给她偷偷的用!这样子就不担心被锤了.机智如我.jpg ​​ 正文 环境安装: dlib库的安装 本博客提供三种方法进行安装 T1方法:pip

  • Android 利用OpenCV制作人脸检测APP

    目录 前言 第一步:下载并安装Android studio 第二步:下载SDK tools 第三步:新建一个Android APP项目 第四步:下载Opencv 第五步:导入OpenCV 第六步:添加代码 第七步:连接手机运行程序 前言 本篇文章手把手教大家使用OpenCV来实现一个能在安卓手机上运行的人脸检测APP.其实不仅仅是能检测人脸,还能检测鼻子,嘴巴,眼睛和耳朵.花了不少精力写这篇文章,希望点赞收藏关注. 无图无真相,先把APP运行的结果给大家看看. 如上图所示,APP运行后,点击"选

  • 基于Python+OpenCV制作屏幕录制工具

    目录 应用平台 屏幕录制部分 计算视频最优fps及使用numpy计算中间帧数组 使用pynput监听键盘按键 如何保存MP4格式视频 源码 总结 最近有在使用屏幕录制软件录制桌面,在用的过程中突发奇想,使用python能不能做屏幕录制工具,也锻炼下自己的动手能力.接下准备写使用python如何做屏幕录制工具的系列文章: 录制屏幕制作视频 录制音频 合成视频,音频 基于pyqt5制作可视化窗口 大概上述四个部分,希望自己能够尽快完善,接下来开始使用python制作屏幕录制部分. 应用平台 wind

  • 基于C++ OpenCV制作电子相册查看器

    目录 前言 一.图片读取 二.图片展示 三.键盘控制 四.效果显示 五.源码 总结 前言 本文将使用OpenCV C++ 制作电子相册查看器.类似于win10系统的“照片”功能.接下来就具体来看看是如何一步步的实现吧. 一.图片读取 我们想要一张张的查看文件夹下的图片,第一步就得读取将该文件夹下的所有图片. 如上图所示,为我创建的文件夹,该文件夹下有14张图片.接下来我们就编写代码读取该文件夹下的所有图片.将读取到的图片存储在images容器. //读取文件夹下所有图片 string filen

  • C++ OpenCV制作黑客帝国风格的照片

    目录 准备工作 开始写代码 完整代码 总结 前不久,黑客帝国系列最新的 <矩阵重启> 上映了.黑客帝国是早期科幻类型的翘楚.但是这次有点垮了.豆瓣评分不到6分. 小的时候,看到黑客帝国的那些照片,一串串数字从上而下, 感觉特别酷炫. 今天我们就来看看怎么制作类似的效果. 准备工作 一张基努里维斯的照片 准备好项目需要使用到的库 opencv,在 CMakeLists.txt 里配置完成. cmake_minimum_required(VERSION 3.17) project(opencv_d

  • Android 利用OpenCV制作人脸检测APP

    目录 前言 第一步:下载并安装Android studio 第二步:下载SDK tools 第三步:新建一个Android APP项目 第四步:下载Opencv 第五步:导入OpenCV 第六步:添加代码 第七步:连接手机运行程序 前言 本篇文章手把手教大家使用OpenCV来实现一个能在安卓手机上运行的人脸检测APP.其实不仅仅是能检测人脸,还能检测鼻子,嘴巴,眼睛和耳朵.花了不少精力写这篇文章,希望点赞收藏关注. 无图无真相,先把APP运行的结果给大家看看. 如上图所示,APP运行后,点击"选

  • OpenCV制作Mask图像掩码的案例

    目录 一.掩膜(mask) 二.案例 1.效果图 2. 源码 一.掩膜(mask) 在有些图像处理的函数中有的参数里面会有mask参数,即此函数支持掩膜操作,首先何为掩膜以及有什么用,如下:数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),其作用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域.图像掩膜与其类似,用选定的图像.图形或物体,对处理

随机推荐