牛逼,我用Python实现哈哈镜捉弄女友,女友气的拉黑了我

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之一 哈哈镜效果 Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。这里使用 Python 基于 OpenCV 进行视觉图像处理,...... 阅读详情

在游乐场或者商场中,大家可能会见到过哈哈镜,哈哈镜通过凹凸不平的镜面,将人物或者是物件在镜面显示中进行扭曲,让人看起来非常的搞笑。

对于哈哈镜的成像效果,有两种的方式,一个是下图中间的缩小的效果,另一种则是下图中右侧的放大效果。小编趁着自己的闲暇时间,自己做了一个哈哈镜的软件,用来捉弄一下自己的朋友,大家一起来看看是如何实现的吧。


01.公式原理

对图片进行哈哈镜的操作处理,其实就是像素点位置坐标的一个坐标映射关系的变化,我们来结合下图进行讲解。

上图中,图像的左上角为坐标原点(0,0),图像的右小角为图像坐标的最大值(width,height)。图像的中心坐标点为(cx, cy),当然这里的中心点坐标大家可以设定为图像中的任意一个像素点,都是可以的。图像中的任意一点到中心点(cx,cy)的x、y方向上的距离被定义为tx、ty。而对于放大的哈哈镜来说,特征映射后的(x,y)坐标公式如下:

02.程序实现

有了图像的特征映射公式之后,接下来就是利用程序来实现上面的公式了。这里,我们针对放大哈哈镜的程序来进行讲解,程序如下图所示:

上图中,程序通过形参来获取中心点的坐标信息,然后对输入图像的每一个坐标,都进行坐标位置的坐标映射,最后将映射后的特征坐标进行像素赋值,并返回最终的结果。

这样我们就完成了对于一张图片的放大哈哈镜的效果。而对于缩小的哈哈镜程序,其处理的方式也是相同的,针对每一个像素坐标,按照缩小哈哈镜的公式进行坐标的映射后得到最终的结果。

03.程序界面

本次程序界面的设计,我们采用的是tkinter进行界面的搭建,页面整体的结构布局如下。

界面的左侧是功能按钮的选择区域,大家可以点击不同的按钮进行功能的选择,界面的中间部分是图片的展示区域,而右侧则是滑动条,用来进行中心坐标点(cx,cy)的设置。对于放大效果按钮所控制的函数,如下图所示。

函数通过读入滑动条的数值来设置中心点(cx,cy)的数值,同时通过放大函数处理图片,并将处理好的图片在界面中进行展示。而对于缩小效果按钮所控制的函数,其函数功能就是通过缩小函数处理图片,并将图片显示在界面上。

04.效果展示

以上就是关于程序内容的简单讲解,接下来我们通过视频展示的方式来看一下如何运行软件,以及我们的哈哈镜效果吧。

大家在拿到程序后,可以用程序来处理自己的图片发给好友,看看他们的反应如何,感兴趣的小伙伴抓紧来试试吧。

如何获取源码:

在公众号后台输入:小助手,找他拿。备注暗号(哈哈镜)

往期推荐阅读:

哈哈镜效果的图片变形技术实现 本文还有配套的精品资源,点击获取 简介:“哈哈镜代码”指的是一种图像处理技术,它能够对图片进行变形,创造出奇特夸张的效果。实现这种效果的核心是通过编程实现图像扭曲、拉伸、压缩等变换。本课程项目将介绍如何使用PIL/Pillow或OpenCV等图像处理库,掌握仿射变换、透视变换、Warping、Distortion Filters和Randomization等技术,创建立体感... 阅读详情

相关推荐

哈哈镜特效

跟大家分享一下,好玩的特效,看一看哈哈镜中的自己吧!

利用python-opencv 做出图像/视频的哈哈镜效果

@[TOP](利用python-opencv 做出图像/视频的哈哈镜效果) 引言 在进行过相机校准的学习之后,我们已经理解了相机的外参/内参矩阵。 关于相机校准的原理以及内外参矩阵的介绍可以参考 我们可以做一个简单的应用:通过opencv-python cv 弯曲所生成的图像。 我们来看看原理: 原理 构建哈哈镜需要三个步骤: 构建一个虚拟相机 对于图像输入,先由图片定义虚拟世界坐标(图片位于XOY平面),将变形函数应用至其上(XOY以z轴为法线,可用plane.Z表示), 最后经过虚拟相机的参

Crevettes的博客 1965

Python和Opencv构建哈哈镜.zip

Python和Opencv构建哈哈镜.zip

基于Python-Opencv实现哈哈镜效果

基于Python-Opencv实现哈哈镜效果,虚拟相机创建、定义3D镜面、坐标重映射

exsolar_521的博客 1448

PMOS缓启动电路设计实战:用LTspice优化上电时序,把60A冲击降到15A

本文通过一个实战案例,深入解析了PMOS缓启动电路如何有效抑制上电冲击电流。文章指出,低ESR电容是导致冲击电流飙升的元凶,并详细阐述了利用LTspice仿真工具,通过优化栅极电阻和栅源电容等参数,将高达60A的冲击电流成功降至15A的设计与优化过程,为电源开关电路设计提供了可复用的方法论。

onion的博客 899

win10和Mac上安装Freesurfer

Mac安装Freesurfer 软件下载地址 可以根据官方给出的demo视频一步一步下载

Daily_365的博客 6077

opencv-python处理图片的一些列操作之几何变换

一般的变换放大缩小(都是由插值算法得到的,但是都会有损失,目前的超分辨率网络,应该是最好的图像算法,到时候会讲一下超分辨率网络) 直接进入opencv函数(具体插值算法可百度,简单的很)

东方佑 1114

HDRP shader 获取阴影(Custom Pass)

Unity:2021.3.0f1 HDRP:12.1.6

LanQ的博客 2098

实现抖音哈哈镜效果---OpenCV-Python开发指南(47)

目录前言哈哈镜放大效果 前言 在抖音中,我们经常看到各种抖音玩家都喜欢使用哈哈镜效果。那么什么是哈哈镜呢? 在现实生活中,哈哈镜是指一种表面凹凸不平的镜子,可以反应出人像及物体的扭曲面貌。简单点来说就是拉伸人脸(物件),或者压缩人脸(物体)的效果。 哈哈镜的实现原理如下: 假设输入图像的宽高为w和h,图像中心点的坐标为(cx,cy)。那么图像中任意一点(x,y)到中心点的距离为(x-cx),(y-cy)。 那么拉升放大,图像变换的半径为r,得到公式如下: x=(tx/2)(sqrt(txtx+tyty)/r

李元静 9383

Mplus实战:如何用潜在类别分析(LCA)快速搞定心理学数据分类?

本文详细介绍了如何运用Mplus软件进行潜在类别分析(LCA),以快速处理心理学数据并识别内部异质性群体。文章从数据准备、Mplus语法编写、模型拟合与选择,到结果解读与高级应用(如纳入协变量),提供了完整的实战指南,帮助研究者从变量视角转向个体视角,有效挖掘数据中的潜在子类别。

weixin_28318011的博客 410

全国职业院校技能大赛-大数据应用赛项-数据挖掘-01

-----------------------推荐Top5结果如下--------------------------------------------第一条数据前10列结果展示为:----------------------------------------相同种类前10的id结果展示为:--------------------相似度top5(商品id:14,平均相似度:0.522356)相似度top1(商品id:1,平均相似度:0.983456)若属于该spu_id,则内容为1否则为0。

Eternity_04的博客 1954

使用OpenCV实现哈哈镜效果

使用OpenCV实现哈哈镜效果。

baidu的专栏 1196

多传感器标定全栈系统学习教程

无论是激光雷达(Lidar)、毫米波雷达(Radar)、相机(Camera)还是惯导(IMU),传感器之间的精确标定直接决定了系统的可靠性与性能。本文将以系统化的视角,梳理多传感器标定的核心知识体系,并分享一套覆盖全栈技术的学习路径。Calibration)是实现点云与图像融合的前提,而雷达与车辆的标定(Radar2Car)则是精准速度估计的关键。:Lidar2Car、Camera2Car的快速标定流程,标定板布置规范。:从单传感器标定入手(如相机内参),逐步过渡到多传感器联合标定。

weixin_41792788的博客 904

【opencv实战】哈哈镜

目录 一、opencv的前身后世 1、简介 2、IplImage介绍 3、Mat介绍 二、哈哈镜介绍 1、原理 2、实现          3、凸透镜算法 4、凹透镜算法 因为要做一个项目,为了实现他的趣味性,所以想应用图像处理做一些东西,在上次完成卡通化之后,又了解了哈哈镜效果,想自己实现,从网上找了好多教程,都是以前的opencv版本的代码,在opencv3.0及以上版本已...

水亦心的博客 4494

基于YOLOv26的智能农业无人机巡检系统

本文提出了一种基于YOLOv26的智能农业无人机巡检系统。系统采用模块化设计,包含数据采集、预处理、目标检测、图像拼接、分析决策和部署控制六大核心模块。无人机搭载多光谱相机、RGB相机和热红外相机进行农田数据采集,通过YOLOv26实现作物病虫害、杂草及灌溉设备的检测。系统采用PyTorch、OpenCV等技术栈,支持无人机自动路径规划和多传感器数据采集,并包含数据增强和预处理功能。该系统可有效提升农业巡检效率,为精准农业提供智能化解决方案。

一键难忘的博客 808

损失函数大汇总(六十一)(Signed Distance Map Loss附公式推导与代码)

摘要 本文介绍了Signed Distance Map (SDM) Loss,一种将形状先验直接融入分割任务的方法。SDM将每个像素表示为到目标边界的带符号距离(内部为负,外部为正),相比二值mask能更连续地表达形状几何信息。SDM Loss的核心思想是让网络学习这个隐式形状场,通过可微的Heaviside函数近似将SDM转换为分割结果。文中重点分析了一种product-based regression loss,它能同时关注距离数值和内外符号的正确性,对边界区域尤为敏感。SDM Loss通常与传统的分割

悦学共鸣,温柔以待,汇聚光芒,共同成长 188

opencv-python图片处理之哈哈镜

https://dongfangyou.blog.youkuaiyun.com/article/details/106882391

东方佑 1293

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Learn Opencv ---- 使用Opencv构建哈哈镜

阅读原文 使用Opencv构建哈哈镜前言形成图像的理论如何实现创建虚拟相机定义三维曲面使用Python的VCAM库图像重映射总结 前言     在童年时期,有一个东西时常能给我带来欢乐,那就是哈哈镜。哈哈镜不是传统的平面镜,而是凹凸不平的镜面。当人们来到镜子面前时,镜子中的自己会发生奇怪的扭曲,带来欢笑声。     这篇博文的主要动机是鼓励读者去学习相机的内外参数,相机的投影矩阵以及如何使用几何来表现图像。  &nbs

ZeroSwift的博客 1025

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OpenCV进阶(11)使用 OpenCV实现哈哈镜

我们都记得那些我们经常去游乐园或县集市的美好童年时光。这些游乐园中我最喜欢的元素之一是游乐园镜室。 哈哈镜不是平面镜,而是凸/凹反射面的组合,当我们在这些镜子前移动时,会产生扭曲效果,看起来很有趣。 在这篇文章中,我们将学习使用 OpenCV 创建我们自己的哈哈镜。 这篇文章的代码灵感来自项目 FunMirrors 和 VirtualCam。 这篇文章的主要动机是鼓励我们的读者学习基本概念,如成像几何,相机投影矩阵,相机的内在和外在参数。 在这篇文章结束时,您将能够意识到这样一个事实,即在对基本概念和理论有

weixin_43229348的博客 3310

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python视觉实战项目31讲源码地址

Python视觉实战项目31讲源码地址 来源: 公众号 小白学视觉 2月1日 使用OpenCV实现猜词游戏 https://github.com/spmallick/learnopencv/tree/master/Hangman 使用OpenCV实现图像修复 https://github.com/spmallick/learnopencv/tree/master/Image-Inpainting 自适应显着性的图像分割 https://github.com/TimChinenov/GraspPicture

weixin_48646621的博客 904

OpenCV 实现哈哈镜效果

代码,有参考别人的代码 // haha_mirror.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include "cv.h" #include "highgui.h" #include "math.h" #include "opencv2/core/core.hpp" #pragma comment(lib,"openc

shiter编写程序的艺术 8439

图像处理的哈哈镜

图像处理的哈哈镜说起哈哈镜这个东西,好像已经很长时间没有见过了,这曾经在小时候是带来很多乐趣的东西。哈哈镜嘛,无非就是凹面镜或者凸面镜,什么效果呢?凹面镜把人变瘦了,凸面镜把人变瘦了。反映在图像上呢,就是图像的局部的缩放。注意不是整体的放大或缩小,只是一个区域被放大和缩小。为了简单期间,只讨论圆形的区域,因此无非存在两种情况,圆形区域的中心被放大周匝被缩小,或者中心被缩小周匝被放大,而且由中心到周匝

摆活儿 6943

简单的matlab哈哈镜

clc; close all; clear all; path1 = 'e:\img\ds2.jpg'; im1 = imread(path1); [m,n,c] = size(im1); ratio = 400 / min(m,n); im1 = imresize(im1, ratio); [m,n,c] = size(im1); im1 = im2double

walle的博客 2307
上一篇: 为什么 Python 的 f-string 可以连接字符串与数字?
下一篇: 太给力了!GitHub18.5K标星,超实用Python备忘录,真全!
菜鸟学Python
博客等级 码龄9年 8062粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值