7-Python-从图像读取到人脸检测-OpenCV-版-个经常出现示例 (7Python找个图进行最短路径计算)
OpenCV是计算机视觉畛域最盛行的库之一。它最后是用C和C++编写的。如今也可以在/target=_blankclass=infotextkey>Python中经常使用。它最后是由英特尔开发的。该库是一个跨平台的开源库。无偿经常使用。OpenCV库是一个高度优化的库,其关键重点是实时运行程序。
OpenCV库是2500多个优化算法的组合。它可以用来检测和识别不同的人脸,在图像中或实时识别物体,经常使用视频和网络摄像头分类不同的人类行为,跟踪摄像机的静止,跟踪像汽车、人类等移生物体,实时计数物体,将图像拼接在一同发生高分辨率图像,从图像数据库中找到相似的图像,从经常使用闪光灯拍摄的图像中去除红眼,提高图像品质,跟踪眼球静止,跟踪人脸等
它领有大概4.7万生动用户社区,预计下载量超越1800万次。许多大公司,如谷歌,亚马逊,特斯拉,微软,本田等经常使用OpenCV,使他们的产品更好,更智能。
先决条件
在开局编写代码之前,咱们须要在咱们的设施上装置OpenCV。假设你是专业的编程人员并且知道每一个IDE,那么去Pycharm并且在设置中从它的包治理器中装置OpenCV-python。
假设您是初学者或中级程序员,或许只是想关注该博客,那么咱们将经常使用代码编辑器而不是IDE。只有转到VisualStudioCode网站并依据您的操作系统下载最新版本即可。如今,咱们将创立一个虚构环境,在其中将装置OpenCV。关上终端,而后经常使用cd定位到桌面。经常使用名为opencv的mkdir创立一个文件夹而后在以下命令中运转。
python-mvenvenv
如今经常使用envscriptsactivate命令激活环境,你会看到在C:UsersusernameDesktopopencv前发生一个带小括号的(env)。如今只有经常使用pip装置OpenCV。
pipinstallopencv-python
咱们将在这个博客中涵盖7个主题:
1.读、写和展现一个图像
为了经常使用OpenCV读取图像,咱们经常使用函数imread(),为了显示图像,咱们经常使用函数imshow(),为了写入图像,咱们经常使用函数imwrite()。让咱们看看每一个的语法。
img=cv2.imread("PATH_TO_IMAGE.jpg/png")Exampleimg=imread("images/dog0.jpg")
cv2.imshow("WINDOWNAME",IMG_VAR)Exampleimshow("DogImage",img)
imwrite():
cv2.imwrite(FILENAME,IMAGE)filename:Astringrepresentingthefilename.Thefilenamemustincludeimageformatlike.jpg,.png,etc.image:Itistheimagethatistobesaved.Examplecv2.imwrite('images/img',img)
.读取视频与集成网络摄像头
读取视频文件与读取OpenCV中的图像文件十分相似。不同之处在于咱们经常使用cv2.videocapture()
语法:
video=cv2.VideoCapture("FILEPATH.mp4")Examplevideo=cv2.VideoCapture("video/dog/dog.mp4")
视频是许多帧图像在一同的汇合,每一帧都是一个图像。要经常使用OpenCV观看视频,咱们只有要经常使用while循环显示视频的每一帧。
whileTrue:success,img=cap.read()cv2.imshow("Video",img)ifcv2.wtKey(1)&0xff==ord('q'):##key'q'willbreaktheloopbreak
为了与网络摄像头集成,咱们须要传递网络摄像头的端口值,而不是门路到视频。假设你经常使用的是笔记本电脑,没有衔接任何外部摄像头,那么便捷地传递0,假设你衔接了任何外部摄像头,那么传递一个摄像头端口值。
cap=cv2.VideoCapture(0)cap.set(3,640)##Framewidthcap.set(4,480)##FrameHeightcap.set(10,100)##BrightnesswhileTrue:success,img=cap.read()cv2.imshow("Video",img)ifcv2.waitKey(1)&0xff==ord('q'):break
3.缩放和裁剪图像
(1)缩放图像
缩放是一个扭转图像状态的环节。在Opencv,咱们可以经常使用resize函数来调整图像的状态。
语法:
cv2.resize(IMG,(WIDTH,HEIGHT))IMG:imagewhichwewanttoresizeWIDTH:newwidthoftheresizeimageHEIGHT:newheightoftheresizeimageExamplecv2.resize(img,(224,224))
要调整图像的大小,咱们首先须要知道图像的状态。咱们可以应用shape找到图像的状态,而后依据以后图像的状态,咱们可以增大或减小图像的大小。让咱们举个例子来看看。
importcv2img=cv2.imread("images/img0.jpg")##Chooseanyimageprint(img.shape)imgResize=cv2.resize(img,(224,224))##DecreasesizeimgResize2=cv2.resize(img,(1024,1024))##Increasesizecv2.imshow("Image",img)cv2.imshow("ImageResize",imgResize)cv2.imshow("ImageIncreasesize",imgResize2)print(imgResize.shape)cv2.waitKey(0)
假设您不想把图像宽度和高度写死,您也可以依据现有的状态,而后依据比例扭转图像的宽度和高度。
importcv2img=cv2.imread("images/img0.jpg")##Chooseanyimageprint(img.shape)shape=img.shapeimgResize=cv2.resize(img,(shape[0]//2,shape[1]//2))##DecreasesizeimgResize2=cv2.resize(img,(shape[0]*2,shape[1]*2))##Increasesizecv2.imshow("Image",img)cv2.imshow("ImageResize",imgResize)cv2.imshow("ImageIncreasesize",imgResize2)print(imgResize.shape)cv2.waitKey(0)
(2)裁剪图像
裁剪是失掉局部图像的环节。在OpenCV中,咱们可以经过定义裁剪后的矩形坐标来口头裁剪。
语法:
imgCropped=img[y1:y2,x1:x2](x1,y1):top-leftvertex(x2,y2):bottom-rightvertexExampleimgCropped=img[0:100,200:200]
经常使用裁剪方法,让咱们尝试从图像中提取Monalisa的脸。
importcv2img=cv2.imread("images/img0.jpg")imgCropped=img[50:250,120:330]cv2.imshow("Imagecropped",imgCropped)cv2.imshow("Image",img)cv2.waitKey(0)
您还可以经常使用绘画形式来查找(x1,y1)、(x2,y2)的正确坐标。
这里有个小义务:
4.经常使用函数的基本图像滤波器
咱们可以在图像上经常使用许多基本的滤波器,比如将图片转换成灰度、含糊等等。
(1)从Img到gray
为了将图像从黑白图像转换为灰度图像,咱们可以经常使用函数cv2.cvtColor,在这里咱们传递cv2.COLOR_BGR2GRAY作为参数。
语法:
imgGray=cv2.cvtColor(IMG,cv2.CODE)IMG:OriginalimageCODE:ConversioncodeforGray(COLOR_BGR2GRAY)ExampleimgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
(2)从Img到HSV
为了将图像转换为HSV色彩空间,咱们可以经常使用函数cv2.cvtColor,这里咱们传递cv2.COLOR_BGR2HSV作为参数。它关键用于指标跟踪。
语法:
imgGray=cv2.cvtColor(IMG,cv2.CODE)IMG:OriginalimageCODE:ConversioncodeforGray(COLOR_BGR2HSV)ExampleimgHsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
(3)含糊图像
含糊用于去除图像中的噪声,也称为平滑。它是对图像运行低通滤波器的环节。在OpenCV中对图像启动含糊,咱们罕用GaussianBlur。
语法:
imgBlur=cv2.GaussianBlur(img,(sigmaX,sigmaY),kernalSize)kernalsize−ASizeobjectrepresentingthesizeofthekernel.sigmaX−AvariablerepresentingtheGaussiankernelstandarddeviationinXdirection.sigmaY-sameassigmaXExmapleimgBlur=cv2.GaussianBlur(img,(3,3),0)
(4)边缘检测
在OpenCV中,咱们经常使用Canny算子来检测图像中的边缘。也有不同的边缘检测器,但最驰名的是Canny算子。Canny算子边缘检测是一种边缘检测算子,它经常使用多级算法来检测图像中的大范围边缘,是由JohnF.Canny在1986年提出的。
语法:
imgCanny=cv2.Canny(img,threshold1,threshold2)threshold1,threshold2:DifferentvaluesofthresholddifferentforeveryimagesExampleimgCanny=cv2.Canny(img,100,150)
(5)收缩
收缩被用来参与图像中边缘的大小。首先,咱们定义了奇数(5,5)的核矩阵大小。而后经常使用内核,咱们对图像口头收缩。上方咱们对Canny算子的输入图像启动了收缩。
语法:
kernel=np.ones((5,5),np.uint8)##DEFININGKERNELOF5x5imgDialation=cv2.dilate(imgCanny,kernel,iterations=1)##DIALATION
(6)腐蚀
腐蚀与收缩正好相反。该算法用于减小图像中边缘的大小。首先,咱们定义了奇数(5,5)的核矩阵大小。而后经常使用内核,咱们对图像口头腐蚀。上方咱们对Canny算子的输入图像启动腐蚀处置。
kernel=np.ones((5,5),np.uint8)##DEFININGKERNELOF5x5imgDialation=cv2.erode(imgCanny,kernel,iterations=1)##EROSION
如今,在同一个程序中经常使用上述基本函数处置Monalisa图像。
5.绘制不同的状态
咱们可以经常使用OpenCV绘制不同的状态,像矩形,圆形,线等。
(1)长方形:
要在图像上绘制一个矩形,咱们经常使用cv2.rectangle函数。在函数中,咱们将宽度、高度、x、y、RGB中的色彩、深度作为参数传递。
语法:
cv2.rectangle(img,(w,h),(x,y),(R,G,B),THICKNESS)w:widthh:heightx:distancefromxaxisy:distancefromyaxisR,G,B:colorinRGBform(255,255,0)THICKNESS:thicknessofrectangel(integer)Examplecv2.rectangle(img,(100,300),(200,300),(255,0,255),2)
(2)圆形:
为了绘制一个圆形,咱们经常使用cv2.circle函数。咱们传递x,y,半径大小,RGB色彩,深度作为参数。
语法:
cv2.circle(img,(x,y),radius,(R,G,B),THICKNESS)x:distancefromxaxisy:distancefromyaxisradius:sizeofradius(integer)R,G,B:colorinRGBform(255,255,0)THICKNESS:thicknessofrectangel(integer)Examplecv2.circle(img,(200,130),90,(255,255,0),2)
(3)直线:
要绘制一条直线,咱们经常使用cv2.line函数传递起始点(x1,y1)、终点(x2,y2)、RGB格局的色彩、深度作为参数。
语法:
cv2.line(img,(x1,y1),(x2,y2),(R,G,B),THICKNESS)x1,y1:startpointofline(integer)x2,y2:endpointofline(integer)R,G,B:colorinRGBform(255,255,0)THICKNESS:thicknessofrectangel(integer)Examplecv2.line(img,(110,260),(300,260),(0,255,0),3)
6.在图像上写文字
在OpenCV中,咱们有一个函数cv2.puttext,用于在特定位置在图像上写入文本。它以图像、文本、x、y、色彩、字体、字号、粗细作为输入参数。
语法:
cv2.putText(img,text,(x,y),FONT,FONT_SCALE,(R,G,B),THICKNESS)img:imagetoputtextontext:texttoputonimageX:textdistancefromXaxisY:textdistancefromYaxisFONT:TypeofFONT(ALLFONTTYPES)FONT_SCALE:ScaleofFont(Integer)R,G,B:colorinRGBform(255,255,0)THICKNESS:thicknessofrectangel(integer)Examplecv2.putText(img,"HELLO",(120,250),cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),2)
7.检测和裁剪人脸
人脸检测在人脸识别系统中十分有用。在OpenCV中,咱们有许多预先训练的haar级联分类器可用于不同的义务。以下网址可以检查OpenCV上的分类器列表:
咱们经常使用haarcascade_frontalface_default.xml分类器来检测图像中的人脸。它将前往图像的四个坐标(w,h,x,y)。经常使用这些坐标,咱们要在脸上画一个矩形,而后经常使用相反的坐标,继续裁剪人脸。最后经常使用imwrite,把裁剪后的图像保留到目录中。
importcv2#Loadthecascadeface_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#Readtheinputimageimg=cv2.imread('images/img0.jpg')#Convertintograyscalegray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#Detectfacesfaces=face_cascade.detectMultiScale(gray,1.3,4)#Drawrectanglearoundthefacesfor(x,y,w,h)infaces:cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)#CroppingFacecrop_face=img[y:y+h,x:x+w]#SavingCroppedFacecv2.imwrite(str(w)+str(h)+'_faces.jpg',crop_face)cv2.imshow('img',img)cv2.imshow("imgcropped",crop_face)cv2.waitKey()
人脸识别为什么用python开发
可以使用OpenCV,OpenCV的人脸检测功能在一般场合还是不错的。而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码。
![Python](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
写代码之前应该先安装python-opencv:
1
怎样使用OpenCV进行人脸识别不知道你说的人脸识别是识别出来是某个人还是只是在图像中检测出人脸。 刚用opencv完成对自己的人脸识别,但是还需要继续优化。 说一下大致步骤吧:1、首先就是数据的准备,你要从网络上下载一些人脸库,后面用来训练人脸识别模型。 人脸检测模型opencv是自带的,但是识别模型需要自己训练。 下载人脸库之后需要对人脸进行标记,这是一个繁琐的工作,不过网上有脚本或者自己写个程序简化工作量。 2、把数据标记好之后就是opencv的事情。 训练的函数非常简单。 只有下面这三句:Ptr<FaceRecognizer> model = createEigenFaceRecognizer();model->train(images, labels);model->save();3、然后打开摄像头进行人脸检测,就是框出人脸的位置。 人脸检测模型是opencv自带的。 CascadeClassifier cascade;(haarcascade_frontalface_);这是加载的方法。 (gray, faces,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH| CV_HAAR_SCALE_IMAGE,Size(30, 30));这是检测的方法。 这里检测得到的就是一个一个的人脸的矩形框,然后用画矩形的方法把它们画出来就行了。 4、然后就是对检测到的人脸进行识别了,用我们刚才训练好的人脸模型。 加载:Ptr<FaceRecognizer> modelPCA = createEigenFaceRecognizer();modelPCA->load();检测:int predictPCA = 0;if ( >= 120){resize(face, face_test, Size(92, 112)); }if (!face_()){predictPCA = modelPCA->predict(face_test);}如果预测结果等于标记结果,说明识别正确。 大致流程就这样了,如果你对opencv有了一定的了解,应该能看懂了。 没看懂只能私聊了。 第一次回答这么长,自己都有点不习惯。 |
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。