关于opencv-python:基于OpenCV的人脸视频文字检测以及识别的项目五-文字识别二维码简单识别

1.文字辨认运行环境:windows10 + python 3.8 + tesseract 4.0.0-beta.1 (1)装置python模块pip install pytesseract (2)装置tesseract orc下载地址:https://github.com/UB-Mannhei... 点击“tesseract-ocr-w64-setup-v4.0.0-beta.1.20180414.exe”下载安装。留神:装置的时候选中中文包(肯定要下这个 不然前面代码报错):只选外面的 一个就行了 (3)配置tesseract运行文件在本人装python的文件夹外面找到pytesseract.pyD:/python3.8/Lib/site-packages/pytesseract/pytesseract.py 把外面的tesseract_cmd = 'tesseract'批改为:tesseract_cmd = 'D:/opencv-python/Tesseract-OCR/tesseract.exe'(找到你装置Tesseract-OCR的门路即可) (4)而后就能够安心写代码了from PIL import Imageimport pytesseractpath = "img\\text-img.png"text = pytesseract.image_to_string(Image.open(path), lang='chi_sim')print(text)看看成果:辨认:还阔以哈再来一个 下面是图片 上面彩色的是后果and one 这是什么鬼 这张英明一个字也没检测进去 看来这个训练对纯文本图片更敌对 2.二维码辨认二维条码/二维码 是用某种特定的几何图形按肯定法则在立体(二维方向上)散布的、黑白相间的、记录数据符号信息的图形;间接先 pip install pyzbar import cv2import numpy as npfrom pyzbar.pyzbar import decode#读取照片信息img = cv2.imread('../res/qr.png')#调用decode()函数,返回的信息蕴含尺寸rect,数据datacode = decode(img)#打印出二维码信息print(code)学习自:https://github.com/vipstone/f...https://zhuanlan.zhihu.com/p/...

February 24, 2023 · 1 min · jiezi

关于opencv-python:基于OpenCV的人脸视频文字检测以及识别的项目四-图片修复

1.图片修复用opencv实现图片修复 基本原理在于: 咱们本人标定噪声的特色,而后依据噪声四周区域的色彩特色修复噪声所在的区域 有句话说的很贴切 忘了在哪听的了:用邻近的像素替换那些坏标记,使其看起来像是街坊比方这位要去除这个白框框 次要步骤: (1)标定噪声特色先剖析红色框框特色,红色区域的值大略处于[240, 240, 240]~[255, 255, 255]之间 图片中其余区域很少有这么高的像素值 所以咱们能够把这个红色区域提取进去 示意为前景区域 而后对其收缩opencv给咱们提供了一个api ,用cv2.inRange进行二值化解决,cv2.inRange 用法如下 把 low-up之间的值变为255 以外的值变成0 (跟大津法阈值不同)后果如下:(把灯也当做噪点了) (2)扩大噪声区域 优化解决成果cv2.dliate (3)图像修复间接用opencv的api cv2.inpaint函数 用法如下:就是在原图根底上 把mask中前景区域局部的图像依据 flags指定的办法 进行修复 后果:再试一个:总的来说 这玩意次要是靠opencv外面cv2.inpaint这个函数实现 一句话 对于这个红色框框: 找到它 干掉它! (4)代码代码如下 # 图片修复import cv2import numpy as nppath = "./6t.jpg"img = cv2.imread(path)hight, width, depth = img.shape[0:3]# 图片二值化解决,把[240, 240, 240]~[255, 255, 255]以外的色彩变成0thresh = cv2.inRange(img, np.array([240, 240, 240]), np.array([255, 255, 255]))cv2.imshow("2", thresh)# 创立形态和尺寸的构造元素kernel = np.ones((5, 5), np.uint8)# 扩张待修复区域# dliate参数:原图 内核 侵蚀次数hi_mask = cv2.dilate(thresh, kernel, iterations=1)cv2.imshow("3", hi_mask)# inpaintspecular = cv2.inpaint(img, hi_mask, 5, flags=cv2.INPAINT_TELEA)cv2.namedWindow("Image", 0)cv2.imshow("Image", img)cv2.namedWindow("newImage", 0)cv2.imshow("newImage", specular)cv2.waitKey(0)cv2.destroyAllWindows()一看到这 我就想起来各位男同胞们心心念念的马赛克技术我这个代码去不掉马赛克 因为马赛克区域的RGB值 不是240-255之间马赛克待我钻研钻研再说 ...

February 22, 2023 · 1 min · jiezi

关于opencv-python:基于OpenCV的人脸视频文字检测以及识别的项目三-人脸轮廓化妆

1.装置 face_recognition这个face_recognition 是一个很简略的人脸识别库 ,是在dlib框架(蕴含机器学习算法和工具的现代化工具包)上做的整合 第一步装置这俩pip install Cmakepip install boost而后就要装置 dlib Windows上装置dlib容易出问题 能够间接装置 .whl文件留神:这个whl文件 要跟python配套 然而当初这个whl文件高版本根本没进去 我前两天装的python3.11找不到对应whl文件 又从新装的python3.8 从新配的环境上面的 对应3.8的dlib..whl文件链接:https://pan.baidu.com/s/1g33E... 提取码:xu0f 第二步 装置whl到你寄存whl文件的文件夹外面 cmd 输出命令pip install dlib-19.19.0-cp38-cp38-win_amd64.whl第三步 而后就能够欢快的装置装置 face_recognition 了pip install face_recognition而后就可能欢快的写轮廓检测程序了 2.人脸轮廓检测# coding=utf-8# 绘制面部轮廓import face_recognitionfrom PIL import Image, ImageDraw# 将图片文件加载到numpy 数组中image = face_recognition.load_image_file("./8.jpg")# 查找图像中所有面部的所有面部特色face_landmarks_list = face_recognition.face_landmarks(image)for face_landmarks in face_landmarks_list: facial_features = [ 'chin', 'left_eyebrow', 'right_eyebrow', 'nose_bridge', 'nose_tip', 'left_eye', 'right_eye', 'top_lip', 'bottom_lip' ] pil_image = Image.fromarray(image) d = ImageDraw.Draw(pil_image) for facial_feature in facial_features: d.line(face_landmarks[facial_feature], fill=(255, 255, 255), width=3) pil_image.show()这次我大威少能够了 hhhh ...

February 21, 2023 · 1 min · jiezi

关于opencv-python:基于OpenCV的人脸视频文字检测以及识别的项目二-图片和视频人脸检测

开始正式写货色 python是比 c++简略多了hh 一. 图片人脸检测opencv外面曾经提供好了人脸分类模型 下载地址:https://github.com/opencv/ope... 可全副下载到本地 下载的xml.zip 别忘了解压 实现思路,次要包含三方面内容:(1)图像变为灰度图像(升高计算强度) (2)在图像上画矩形 (上述两方面内容就间接利用opencv提供的函数接口就行了)(3)利用OpenCV训练好的人脸分类模型查找人脸 import cv2filepath = "./8.jpg"img = cv2.imread(filepath) # 读取图片gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换灰色# OpenCV人脸识别分类器# 先拿到分类器classifierclassifier = cv2.CascadeClassifier( "D://opencv-python//opencv-github//haarcascade_frontalface_default.xml")color = (0, 255, 0) # 定义绘制色彩# 调用辨认人脸detectMultiScale gray是输出图像 scaleFactor图像缩放比例 # minNeighbors特色检测点周边有多少无效点被同时检测 能够防止脱漏 minSize是特色检测点的最小尺寸faceRects = classifier.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))if len(faceRects): # 大于0则是阐明检测到人脸 for faceRect in faceRects: # 独自框出每一张人脸 x, y, w, h = faceRect # 框出人脸 cv2.rectangle(img, (x, y), (x + h, y + w), color, 2) # 左眼 cv2.circle(img, (x + w // 4, y + h // 4 + 30), min(w // 8, h // 8), color) # 右眼 cv2.circle(img, (x + 3 * w // 4, y + h // 4 + 30), min(w // 8, h // 8), color) # 嘴巴 cv2.rectangle(img, (x + 3 * w // 8, y + 3 * h // 4), (x + 5 * w // 8, y + 7 * h // 8), color)cv2.imshow("image", img) # 显示图像c = cv2.waitKey(10)cv2.waitKey(0) ...

February 20, 2023 · 2 min · jiezi

关于opencv-python:解决cv2cv2-has-no-attribute-CAPPROPORIENTATIONMETA

运行yolov5代码检测视频时,报如下谬误: Traceback (most recent call last):... yolov5/utils/dataloaders.py", line 323, in _new_video self.orientation = int(self.cap.get(cv2.CAP_PROP_ORIENTATION_META)) # rotation degreesAttributeError: module 'cv2.cv2' has no attribute 'CAP_PROP_ORIENTATION_META'搜寻了以下互联网,没有发现有用的解决办法,最初忽然想到CAP_PROP_ORIENTATION_META是一个常,通常来说这种常量为一个数字,于是查问OpenCV的手册,发现cv::CAP_PROP_ORIENTATION_META的值为48,于是间接用48替换原参数,运行胜利! self.orientation = int(self.cap.get(48)) # 替换# self.orientation = int(self.cap.get(cv2.CAP_PROP_ORIENTATION_META))

October 23, 2022 · 1 min · jiezi

关于opencv-python:pythonopencv实现颜色检测轮廓检测颜色追踪

@TOC 筹备工作python配置numpy和openCv库 读取图像和视频图像cv2.imread(门路)cv2.imshow(窗口名称,输入对象)cv2.waitkey(等待时间)import cv2img = cv2.imread("./Resources/3-1P316104441.jpg")//以后我的项目目录下cv2.imshow("output", img)cv2.waitKey(0)视频cv2.VideoCapture(门路或数字)set()(1) set(3,数字)设置显示区域宽(2) set(4,数字)设置显示区域高(3) set(10,数字)设置亮度 read()cv2.imshowimport cv2cap = cv2.VideoCapture("./Resources/Ninja Track.mp4")while True: #success是bool值,用于判断是否读取胜利 success, img = cap.read() cv2.imshow("video", img) if cv2.waitKey(1) & 0xFF == ord('q'): break根底性能图像cv2.cvtColor(对象,cv2.COLOR_BGR2GRAY) 转换为灰度图像cv2.GaussianBlur(对象,(奇数,奇数),0)设置含糊,值越大,含糊水平越大cv2.Canny(对象,数字,数字)设置Canny边缘检测器,数字越大,显示的越少cv2.dilate(边缘对象,矩阵,iteration=数字) 图像收缩,即:减少图像边缘厚度cv2.erode(对象,矩阵而过,iteration=数字)图像侵蚀,即:缩小图像边缘厚度裁剪图像扭转图像大小对象.shape用于显示图片大小print(img.shape)#先显示高度,再显示宽度cv2.resize(对象,(宽度,高度))扭转图片大小imgResize = cv2.resize(img, (200,300))#先定义宽度,在定义高度裁剪图像对象[数字:数字,数字:数字]先高度后宽度 imgCropped = img[0:100,200:300]#先高度后宽度绘制图形和文本创立简略图像numpy.zeros((512,512)) 建设矩阵,0示意彩色为图像增加色彩通道numpy.zeros((数字,数字,3),numpy.unint8)增加色彩三个色彩通道,色彩值为0~255为图像上色对象[数字:数字,数字:数字]=rgb值 img[200:300,:]=255,0,0绘制线条cv2.line(对象,(终点坐标),(起点坐标),(rgb色彩值),厚度) cv2.line(img,(0,0),(300,300),(0,255,0),3)绘制矩形cv2.rectangle(对象,(终点坐标),(起点坐标),(rgb色彩值),厚度) cv2.rectangle(img,(0,0),(100,100),(0,0,255),3)cv2.rectangle(img,(0,0),(100,100),(0,0,255),cv2.FILLED)填充图形绘制圆cv2.circle(对象,(圆心坐标),半径,(rgb色彩值),厚度) cv2.circle(img,(100,100),30,(255,255,0),2)显示文字cv2.putText(对象,“文本内容",(起始坐标),字体款式,缩放比例,(rgb色彩值),厚度) cv2.putText(img,"good",(200,200),cv2.FONT_HERSHEY_COMPLEX,1,(0,150,0),1)视角转换设置待转换坐标numpy.float32([[坐标1],[坐标2],[坐标3],[坐标4]]) pts1 = np.float32([[111,219],[287,188],[154,482],[352,440]])设置转换后坐标numpy,float32([[0,0],[width,0],[0,height],[width,height]])透视图转换cv2.getPrespectiveTransform(待转换坐标,转换后坐标)转换后图像cv2.warpPerspective(对象,透视图转换,(width,height))img = cv2.imread("Resources/puke_zhipai-003.jpg")width,height=250,250pts1 = np.float32([[111,219],[287,188],[154,482],[352,440]])pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]])matrix = cv2.getPerspectiveTransform(pts1,pts2)#透视图转换,将世界坐标系变为屏幕坐标系imgoutput = cv2.warpPerspective(img,matrix,(width,height))cv2.imshow("card",imgoutput)cv2.waitKey(0)图像拼接无奈调整图像大小程度拼接numpy.hstack((对象,对象)) hor = np.hstack((img, img))垂直拼接numpy.vstack((img,img)) ver = np.vstack((img,img))可能调整图像大小编写stackImages函数def stackImages(scale,imgArray): rows = len(imgArray) cols = len(imgArray[0]) rowsAvailable = isinstance(imgArray[0], list) width = imgArray[0][0].shape[1] height = imgArray[0][0].shape[0] if rowsAvailable: for x in range ( 0, rows): for y in range(0, cols): if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]: imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale) else: imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale) if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR) imageBlank = np.zeros((height, width, 3), np.uint8) hor = [imageBlank]*rows hor_con = [imageBlank]*rows for x in range(0, rows): hor[x] = np.hstack(imgArray[x]) ver = np.vstack(hor) else: for x in range(0, rows): if imgArray[x].shape[:2] == imgArray[0].shape[:2]: imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale) else: imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale) if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR) hor= np.hstack(imgArray) ver = hor return verstackImages(缩放比例,程度拼接,垂直拼接)stackImages(0.5,([img,img,img]))stackImages(0.5,([img,img,img],[img,img,img]))色彩检测转换为HSV空间cv2.cvtColor(对象,cv2.COLOR_BGR2HSV)设置色彩调节器定义一个窗口cv2.namedWindow("窗口名")设置窗口大小cv2.resizeWindow("对应窗口名",宽度,高度)创立滑动控制器def empty(): passcv2.namedWindow("TrackBars")cv2.resizeWindow("TrackBars", 640, 240)cv2.createTrackbar("Hue Min", "TrackBars", 0, 179, empty)cv2.createTrackbar("Hue Max", "TrackBars", 179, 179, empty)cv2.createTrackbar("Sat Min", "TrackBars", 0, 255, empty)cv2.createTrackbar("Sat Max", "TrackBars", 255, 255, empty)cv2.createTrackbar("Val Min", "TrackBars", 0, 255, empty)cv2.createTrackbar("Val Max", "TrackBars", 255, 255, empty)将色彩调节器和HSV图像进行关联获取控制器值cv2.getTrackbarPos("控制器名","相应窗口名") h_min = cv2.getTrackbarPos("Hue Min", "TrackBars") h_max = cv2.getTrackbarPos("Hue Max", "TrackBars") s_min = cv2.getTrackbarPos("Sat Min", "TrackBars") s_max = cv2.getTrackbarPos("Sat Max", "TrackBars") v_min = cv2.getTrackbarPos("Val Min", "TrackBars") v_max = cv2.getTrackbarPos("Val Max", "TrackBars")设置过滤图像(1)最低阀值 ...

November 21, 2020 · 7 min · jiezi

关于opencv-python:python-opencv-自适应大小中央显示图片或者视频

先给代码地方显示图片三个工具函数,间接前面有三行代码的示例。 import cv2import tkinter as tkdef GetScreenCenter(): root = tk.Tk() return root.winfo_screenwidth()//2,root.winfo_screenheight()//2def AdaptSize(img): # 视频、图片过大间接1/2 center_x, center_y = GetScreenCenter() img_h, img_w, _ = img.shape if img_h > center_y * 2 or img_w > center_x * 2: img = cv2.resize(img, (img_w // 2, img_h // 2)) return imgdef CentralShow(win_name,video): ret,img=video.read() center_x, center_y = GetScreenCenter() img=AdaptSize(img) img_h,img_w,_=img.shape t_x, t_y = (center_x - img_w // 2), (center_y - img_h // 2) cv2.imshow(win_name, img) cv2.moveWindow(win_name, t_x, t_y) cv2.waitKey(0)# example:win_name='centered image'img=cv2.imread('english.jpg')CentralShow(win_name,img)地方显示视频视频其实是多个图片一直循环,只需屡次读取视频图片即可 ...

November 4, 2020 · 1 min · jiezi

OpenCV搞定腾讯滑块验证码

前言废话滑块验证码破解是一直都想搞的项目,毕竟多数网站都会采用滑块验证码,于是最近在修改论文的闲暇之余把这事儿给解决了。要搞现在的滑块验证码绕不开图像处理,图像处理当然是首推OpenCV-Python啦!当然我的OpenCV非常菜(P.S.两天速成不敢保证代码质量),发现问题就直接指出嘛,不用走流程啦! 环境首先需要一个python,然后安装opencv的python库,如下:pip install opencv-python然后测试一下是否可用,如下: import cv2 as cvimport numpy as npif __name__ == '__main__': img = np.ones((200, 200, 3), np.uint8) * 255 cv.rectangle(img, (50, 50), (150, 150), (0, 0, 255), 2) cv.imshow('test', img) cv.waitKey(0) cv.destroyAllWindows()正常的话就会如下显示: OpenCV的使用相关的API我也是边用边查的,用得也是相当生疏!具体的常用方法大家只好自行百度了,我就不献丑了! 实现原理及方法腾讯滑块验证这次搞得目标就是腾讯滑块验证码,调用腾讯滑块这个接口的网站还是挺多的,比如非常好用的在线画图网站ProcessOn,其中滑块验证部分类似这样子的: 抓个包发现只有滑块图和带缺口的图,如下:破解滑块验证码最为关键的地方在于找到滑块缺口的位置,找到缺口位置后就可以利用Selenium模拟拖动滑块到指定位置实现破解,之前的老办法就是将完整图的像素点和带缺口图的像素点进行比较从而得到缺口位置,但是现在一般不会将完整图暴露给我们,所以只有在带有缺口的图上进行处理。我这里一共有两种方案进行缺口位置识别,一种是基于模板匹配的,另一种是基于轮廓检测的,下面会细讲两种方案的实现方法。 模板匹配识别缺口具体是实现过程如下:1.处理滑块的图片 灰度化滑块图片处理一下滑块图中滑块的外圈使用inRange二值化滑块图使用开运算去除白色噪点运行结果如下所示(左侧为原始滑块,右侧为处理后的滑块): 2.处理带缺口的图片 先来个高斯滤波去噪灰度化带缺口图使用阈值二值化该图运行结果如下所示(左侧为原始图,右侧为处理后的图): 3.进行模板匹配调用模板匹配API并圈出匹配上的区域,结果如下所示: 警告警告警告这种方法的缺口识别率在50%左右,很大一部分原因是滑块图的背景为纯白色,这在匹配时会产生很大的干扰,要是能将滑块图的背景变为透明,正确的匹配率可以达到90%以上 如果大家有任何将滑块图的背景变为透明的办法,可以留言到评论区,我真的万分感谢!!!下面是现阶段的实现代码: # encoding:utf-8import cv2 as cvimport numpy as np# 对滑块进行二值化处理def handle_img1(image): kernel = np.ones((8, 8), np.uint8) # 去滑块的前景噪声内核 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) width, heigth = gray.shape for h in range(heigth): for w in range(width): if gray[w, h] == 0: gray[w, h] = 96 # cv.imshow('gray', gray) binary = cv.inRange(gray, 96, 96) res = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel) # 开运算去除白色噪点 # cv.imshow('res', res) return res# 模板匹配(用于寻找缺口有点误差)def template_match(img_target, img_template): tpl = handle_img1(img_template) # 误差来源就在于滑块的背景图为白色 blurred = cv.GaussianBlur(img_target, (3, 3), 0) # 目标图高斯滤波 gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY) ret, target = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) # 目标图二值化 # cv.imshow("template", tpl) # cv.imshow("target", target) method = cv.TM_CCOEFF_NORMED width, height = tpl.shape[:2] result = cv.matchTemplate(target, tpl, method) min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result) left_up = max_loc right_down = (left_up[0] + height, left_up[1] + width) cv.rectangle(img_target, left_up, right_down, (0, 0, 255), 2) cv.imshow('res', img_target)if __name__ == '__main__': img0 = cv.imread('./demo/3/hycdn_3.jpg') img1 = cv.imread('./demo/3/hycdn_3_2.png') template_match(img0, img1) cv.waitKey(0) cv.destroyAllWindows()轮廓检测识别缺口基于轮廓检测缺口的思路简单很多,加上合理的条件识别率在95%以上,实现过程如下: ...

May 18, 2019 · 2 min · jiezi