Python:我的眼里只有你

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40796925/article/details/87343300


昨天情人节,写了个表白的小代码,将女友照片进行缩放,自动贴到我照片眼球处,表达“我的眼里只有你”。女友喜欢刘昊然,我这颜值是在不咋地,拿昊然弟弟照片来展示效果:

效果图

昊然眼里只有你
注意看眼睛位置
昊然眼睛

思路

Python可以直接调用dlib库进行人脸识别,其中也包含了准度较高的眼部识别。利用dlib面部识别库定位照片中眼球位置,将女友照片进行相应缩放,最终通过PIL将其贴图到眼球处。

dlib

dlib是一个高质量的机器学习、图像处理、深度学习、人脸识别 C++/Python库。Python中可以直接调用dlib库进行面部识别,其中也包含了准度较高的眼部识别,如下图:

dlib面部识别
通过37、38、40、41来确定左眼球位置,43、44、48、47来确定右眼球位置。获取点在照片中的坐标,计算距离来获取眼球区域信息。

裁剪处理眼球中贴图

因为眼球的形状,贴图最好处理成略小于眼球的圆形图,所以代码中先将女友照片缩小成眼球区域大小的矩形图,再进行边缘透明处理和裁剪生成。

def img_deal(input_img):
    img = cv2.imread(input_img, cv2.IMREAD_UNCHANGED)
    rows, cols, channel = img.shape

    img_new = np.zeros((rows, cols, 4), np.uint8)
    img_new[:, :, 0:3] = img[:, :, 0:3]

    img_circle = np.zeros((rows, cols, 1), np.uint8)
    img_circle[:, :, :] = 0
    img_circle = cv2.circle(img_circle, (int(cols / 2), int(rows / 2)), int(min(rows, cols) / 2), 255, -1)

    img_new[:, :, 3] = img_circle[:, :, 0]
    cv2.imwrite('src_circle.png', img_new)

将女友照片缩放成小于该区域的图片,通过PIL将其贴到眼球位置上。

回顾

你可能会说,这很简单啊,PS一下就搞定,比你这还好看。

是的,有点杀鸡用牛刀的鸡肋感。但代码的好处是,设计好的程序高效地自动执行,我就可以专注于提升操作步骤之外的事情了。对于批量化生成图片也是很方便的。此外,除了图片,还可以通过摄像头在视频中进行操作。

昨天有了“眼中有你”的想法,尝试接触面部识别,效果不错有了些初步收获,后续仍需要更深入地学习和应用,跪求懂行的大佬给予指点、也欢迎感兴趣的朋友一起组团学习哈!

代码下载

网盘下载链接,提取码:os3o

Github链接

最后

新年刚过,充实、惬意。

希望更努力的工作和学习,在新的一年里带给我们更快的成长,加油!

如果觉着还可以,欢迎关注下我学习Python升级的公众号哈~
在这里插入图片描述

展开阅读全文

眼里的delphi 8

01-03

Delphi 8 实际上是delphi for .net, borland做了两件事, 一是pascal和.net IL的映射, 这比较简单, 因为.net设计时本来就考虑了多语言支持. 定义了The Common Language Runtime (CLR), the Common Type System (CTS), andrnthe Common Language Specification (CLS) . 而pascal的规范和这些都很接近.rnrn二是做了VCL和net framework的映射, 在win32环境中, net framework是win32 API的一个抽象层, 而旧的VCL也是win32 API的一个抽象层, 为了让旧的delphi程序可以移植到net里, borland只有把VCL做成net framework的一个抽象层, 这很枯燥花时间, 而且运行效率也不会高, 想想两个抽象层就可以理解了. 而且这个改后的VCL目前不兼容win32 API, borland会在未来做这个既抽象net framework, 又抽象win32 API的VCL, 但这更枯燥花时间,不用说而且还要把新的net framework类和新的win32 API集成进去, 整个被M$牵的鼻子走.rnrn为了抽象两个平台, VCL会不可避免的丧失一些东西, 比如midas, midas最初只有DCOM connection的, 后来加了TCP connection, Http connection, 为了和COM交换数据, 他的基本数据传输是用variant array, 但在net framework里, COM被抛弃了, 原因很多, 比如COM是一个二进制的标准, 不同语言的数据类型转化效率不高, , net framework里用CTS, 没数据类型转化的问题, 因为COM不将存在, delphi 的variant array也没存在的必要, 而且net framework里有ADO.net, 他对XML和web service支持的很好, 很适合做简单的多层结构, midas的分布式的优势不复存在. 所以在dephi 8 里没有Midas, borland做了一个基于ADO.net的BDP. BDP完全用了ADO.NET的dabaset, 只是在ADO.NET的data adapter上做了一个抽象层. 使不同的data adapter切换容易了点.rnrn再看一下ECO, ECO是OR Mapping框架的一个实现, 关于数据库程序, 有两种基本model, 一是table model, 象Midas, ADO.NET, 二是domain model, 以object为数据操纵元素, table model直观简单, domain model对设计良好的系统架构很有帮助, 但实现起来较复杂, OR Mapping框架主要用来提高domain model生产力, 程序员不用考虑太多的数据访问细节, 只用关注object class就行了, 这样一来好也不好, 问题就是会容易导致数据库设计性能上的问题, 而且在ECO中, sql是在运行期自动生成的, 目前不可对生成的sql进行修改, 这对于程序员来说没有提供对性能做优化的途径.rnrnrnrnrnrnrn 论坛

没有更多推荐了,返回首页