最近又看了一遍忍界大战,试着做一个自动添加写轮眼的玩意儿。

思路:人脸检测——人眼检测——瞳孔分割——写轮眼添加——融合

opencv用的cascade进行人眼和人脸识别

import numpy as np
import cv2
import os# multiple cascades: https://github.com/Itseez/opencv/tree/master/data/haarcascades
face_cascade = cv2.CascadeClassifier('.\\data\\haarcascades\\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('.\\data\\haarcascades\\haarcascade_eye_tree_eyeglasses.xml')index = 0for root,dir_,files in os.walk("face_data"):for file_ in files:print(os.path.join(root,file_))img = cv2.imread(os.path.join(root,file_))gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, 1.3, 5)for (x,y,w,h) in faces:#人脸区域框cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)roi_gray = gray[y:y+h, x:x+w]roi_color = img[y:y+h, x:x+w]#在检测到的人脸区域内检测眼睛eyes = eye_cascade.detectMultiScale(roi_gray)for (ex,ey,ew,eh) in eyes:if ew*eh<(w*h)//50:continue#眼睛区域框eye_color = roi_color.copy()cv2.rectangle(roi_color,(ex-10,ey-10),(ex+ew+10,ey+eh+10),(0,255,0),2)        font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img,'Eye',(ex+x,ey+y), font, 0.5, (11,255,255), 1, cv2.LINE_AA)# cv2.imshow('eye', eye_color[ey-10:ey+eh+10,ex-10:ex+ew+10])# cv2.waitKey()cv2.imwrite("eye_data/"+str(index)+".jpg",eye_color[ey-10:ey+eh+10,ex-10:ex+ew+10])index = index+1cv2.namedWindow('img', 1)cv2.imshow('img',img)cv2.waitKey()

瞳孔分割用了U^2net进行了训练,数据标了几十个

https://github.com/NathanUA/U-2-Net

最后就是写轮眼添加,写轮眼加到瞳孔分割的部分

import cv2
import numpy as np
import osdef drawInCircle(img_open, img, cont, cX, cY):# 绘制最大内接圆 # 最大内接圆——检索轮廓的方式c = cont    # 单个轮廓contours = cv2.findContours(img_open.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)src = img_open.copy()raw_dist = np.empty(src.shape, dtype=np.float32)for ii in range(src.shape[0]):for jj in range(src.shape[1]):raw_dist[ii, jj] = cv2.pointPolygonTest(c, (jj, ii), True)   # 检测点坐标,与c轮廓坐标的距离minVal, maxVal, _, maxDistPt = cv2.minMaxLoc(raw_dist)   # minMaxLoc查找最小和最大元素值及其位置mamaxVal = abs(maxVal)cv2.circle(img, (cX, cY), np.int(maxVal)-1, (255, 255, 255), 1, cv2.LINE_8, 0)    # 最大内接圆height = np.int(maxVal)-1return np.int(maxVal)-1#def set_eye():\
xly = cv2.imread("xly.png",cv2.IMREAD_UNCHANGED)
b_channel, g_channel, r_channel, alph = cv2.split(xly)for root,dir_,files in os.walk('eye_data'):for index,file_ in enumerate(files):file_mask = os.path.join("eye_mask",file_)pic_mask = cv2.imread(file_mask)pic_eye = cv2.imread(os.path.join(root,file_))gray = cv2.cvtColor(pic_mask,cv2.COLOR_BGR2GRAY)_,th_img = cv2.threshold(gray,100,255,cv2.THRESH_BINARY)contours, hier = cv2.findContours(th_img,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)center,radius = cv2.minEnclosingCircle(contours[0])r = int(radius)cX,cY = (int(center[0]),int(center[1]))pic_mask = cv2.circle(pic_mask,(cX,cY),r,(255,255,0),2)xly = cv2.resize(xly,(2*r,2*r))xly_roi = pic_eye[cY-r:cY+r,cX-r:cX+r]th_img_roi = th_img[cY-r:cY+r,cX-r:cX+r]for x in range(xly_roi.shape[0]):   # 图片的高for y in range(xly_roi.shape[1]):   # 图片的宽px = xly[x,y]if px[3]>0 and th_img_roi[x,y]>0:px1 = px[:-1]tx = 0.5*xly_roi[x,y]+0.5*px1xly_roi[x,y] = txcv2.imshow('pic_mask',pic_eye)cv2.waitKey()

最终效果:

搞定!

opencv python搞个写轮眼相关推荐

  1. opencv安装教程python anaconda_anaconda安装opencv(python)

    1.win10 win10没有安装python,只安装了anaconda,然后使用pip安装opencv-python,版本很新,opencv_python4.0.0的. 网速有点莫名其妙,时快时慢 ...

  2. OpenCV+python:Canny边缘检测算法

    1,边缘处理 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用. 在空域运算中来说,对图像的锐化就是计算微分.由于数字 ...

  3. OpenCV Python在计算机视觉中的应用

    OpenCV Python教程 在这篇文章中,我们将使用Python中的OpenCv来涵盖计算机视觉的各个方面.OpenCV长期以来一直是软件开发的重要组成部分. 什么是计算机视觉? 我们考虑一个场景 ...

  4. OpenCV Python教程(2、图像元素的访问、通道分离与合并)

    OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...

  5. python中import cv2遇到的错误及安装方法_独家利用OpenCV,Python和Ubidots来构建行人计数器程序(附代码amp;解析)...

    作者:Jose Garcia 翻译:吴振东 校对:张一豪 本文约4000字,建议阅读14分钟. 本文将利用OpenCV,Python和Ubidots来编写一个行人计数器程序,并对代码进行了较为详细的讲 ...

  6. 如何把OpenCV Python获取的图像传递到C层处理

    原文:https://blog.csdn.net/yushulx/article/details/52788051 用OpenCV Python来开发,如果想要用到一些C/C++的图像处理库,就需要创 ...

  7. openCV—Python(6)—— 图像算数与逻辑运算

    openCV-Python(6)-- 图像算数与逻辑运算 一.函数简介 1.add-图像矩阵相加 函数原型:add(src1, src2, dst=None, mask=None, dtype=Non ...

  8. opencv python 图像去噪

    opencv python 图像去噪 文章目录: https://blog.csdn.net/Annihilation7/article/details/82718470 https://segmen ...

  9. opencv python 中cv2.putText()函数的用法

    opencv python 中cv2.putText()函数的用法 文章目录: 一.快速使用 二.官方文档 三.使用举例 虽然用啦很多次,还是决定记录一下 一.快速使用 cv2.putText(ima ...

最新文章

  1. java三大集合_java中三大集合框架
  2. MySQL查询面试题
  3. 互联网男士穿搭推荐-2020年新版
  4. python从零开始的学习-python学习过程之从零开始
  5. JAVA常见异常种类
  6. SecureCRT连接CentOS阿里云,小键盘在VIM情况下,无法输入数字反而出现英文
  7. jQuery中的height()、innerheight()、outerheight()的区别总结
  8. 你好骚啊......
  9. 牛客网【每日一题】3月27日 数学考试
  10. OpenSSL命令---pkcs7
  11. Java 8 特性 – 终极手册(一)
  12. python标签打印工具_NiceLabel Designer 2017条码标签打印软件
  13. 三分钟训练眼球追踪术,AI就知道你在盯着哪个妹子 | TensorFlow.js代码
  14. Servlet规范总结
  15. 约束布局管理器 CAConstraintLayoutManager 以及其不起作用
  16. caffe安装编译问题-ImportError: No module named caffe
  17. SVN客户端安装及使用
  18. 二十九、非谓语动词_作定语
  19. 《C语言入门经典》Ivor Horton第十章练习题3
  20. 现货黄金可以在手机操作吗

热门文章

  1. XXE(XML外部实体注入)漏洞
  2. Django | 模板语法之标签的使用(if,for..)
  3. 【转帖】二次元游戏成下一风口,成功入局需要注意什么?
  4. 腐烂国度计算机配置要求,腐烂国度2配置要求高吗 腐烂国度2具体配置要求介绍...
  5. BAT-Python面试题
  6. L - 小鑫の日常系列故事(五)——卡片游戏
  7. pymongo.errors.OperationFailure: Authentication failed., full error: {‘ok‘: 0.0, ‘errmsg‘: ‘Authenti
  8. java处理SQL查询的换行符失效
  9. android 6.0 存储卡,Android 6.0区别U盘和SD卡设备的方法详解
  10. 【python安装xlrd模块】