【OpenCV】3h精通OpenCV

您所在的位置:网站首页 opencv项目python 【OpenCV】3h精通OpenCV

【OpenCV】3h精通OpenCV

2024-07-04 15:06| 来源: 网络整理| 查看: 265

这里写目录标题 一、读取图片和网络摄像头1.1 图片读取1.2 视频读取1.1.1 读取视频文件1.1.2 读取网络摄像头 二、OpenCV基础功能三、调整、裁剪图像3.1 调整图像大小3.2 裁剪图像 四、在图像上绘制形状和文本4.1 图像上绘制形状4.2 图像上绘制文本 五、透视变换六、图像拼接七、颜色检测八、轮廓、形状检测九、人脸检测十、实战10.1 虚拟绘画10.2 纸张扫描10.3 车牌检测器

项目源码:https://github.com/murtazahassan/Learn-OpenCV-in-3-hours

一、读取图片和网络摄像头 1.1 图片读取 import cv2 #读取图像,参数为图像路径 img=cv2.imread('D:\Project\Opencv\Learning02\image01.jpg') #显示图像,两个参数,窗口名称、图像 cv2.imshow('image window',img) cv2.waitKey(1000)#0代表无限延迟,数值代表延迟多少毫秒

在这里插入图片描述

1.2 视频读取 1.1.1 读取视频文件 import cv2 #读取视频 #创建视频捕获对象capture:参数为 视频所在路径 cap=cv2.VideoCapture('D:\Project\Opencv\Learning02\WeChat_20200707183819.mp4') while True: ret, frame = cap.read() cv2.imshow('video image',frame) if cv2.waitKey(1)&0xFF==ord('q'):#结束循环 break

在这里插入图片描述

1.1.2 读取网络摄像头 import cv2 #读取网络摄像头 #创建视频捕获对象capture:参数为数字,0代表默认摄像头,若有多个摄像头则选择其他数字与之对应 cap=cv2.VideoCapture(0) #设置:第一个参数是想要调节的属性的ID,后的调节的大小 cap.set(3,640)# 宽度640 cap.set(4,480)# 高度480 cap.set(10,100)#设置亮度,增加100 while True: ret, frame = cap.read() cv2.imshow('video image',frame) if cv2.waitKey(1)&0xFF==ord('q'):#结束循环 break 二、OpenCV基础功能 import cv2 import numpy as np #读取图像 img=cv2.imread('D:\Project\Opencv\Learning02\image01.png') #灰度变换 gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) cv2.imshow('gray image',gray) #图像模糊 blur=cv2.GaussianBlur(gray,(7,7),0)#图像、内核大小、sigma cv2.imshow('blur image',blur) # 边缘检测 canny=cv2.Canny(gray,100,255)#图像、阈值1、阈值2 cv2.imshow('Canny image',canny) #膨胀 kernel=np.ones((5,5),np.uint8)#对象的类型为8位无符号整数既范围为0-255 dilate=cv2.dilate(canny,(3,3),kernel,iterations=3)#图像,内核大小 cv2.imshow('dilate image',dilate) #腐蚀 erode=cv2.erode(canny,kernel,iterations=3) cv2.imshow('erode image',dilate) cv2.waitKey(0)#0代表无限延迟,数值代表延迟多少毫秒

在这里插入图片描述

三、调整、裁剪图像

  图片的坐标表示: 在这里插入图片描述

3.1 调整图像大小 import cv2 import numpy as np #读取图像 img=cv2.imread('D:\Project\Opencv\Learning02\image01.jpg') cv2.imshow('image',img) #显示原图大小 print(img.shape)#(750, 500,3)分别代表高、宽、深度 #调整图像大小 resize_img=cv2.resize(img,(500,500))#原图,想要调整的大小 cv2.imshow('resize image',resize_img) cv2.waitKey(0)#0代表无限延迟,数值代表延迟多少毫秒

在这里插入图片描述

3.2 裁剪图像 import cv2 import numpy as np #读取图像 img=cv2.imread('D:\Project\Opencv\Learning02\image01.jpg') cv2.imshow('image',img) #显示原图大小 print(img.shape)#(750, 500,3)分别代表高、宽、深度 #裁剪图像 crop_img=img[0:500,:] cv2.imshow('crop image',crop_img) cv2.waitKey(0)#0代表无限延迟,数值代表延迟多少毫秒

在这里插入图片描述

四、在图像上绘制形状和文本 4.1 图像上绘制形状 import cv2 import numpy as np #创建三通道图像 img=np.zeros((400,400,3),np.uint8) cv2.imshow('oringin image',img) #绘制线条 cv2.line(img,(0,0),(img.shape[1],img.shape[0]),(255,0,0),3)#参数图像、线起点坐标、线终点坐标、线颜色、线条宽度 cv2.imshow('line image',img) #绘制矩形 cv2.rectangle(img,(0,0),(int(img.shape[1]/2),int(img.shape[0]/2)),(0,255,0),cv2.FILLED)#参数图像、左上坐标、右下坐标、颜色、线条宽度/填充 cv2.imshow('rectangle image',img) #绘制圆 cv2.circle(img,(int(img.shape[1]/2),int(img.shape[0]/2)),40,(0,0,255),3)#图像,圆心坐标,半径,颜色,线条宽度/填充 cv2.imshow('circle image',img) cv2.waitKey(0)#0代表无限延迟,数值代表延迟多少毫秒

在这里插入图片描述

4.2 图像上绘制文本 import cv2 import numpy as np #创建三通道图像 img=np.zeros((400,400,3),np.uint8) cv2.imshow('oringin image',img) #绘制文本 cv2.putText(img,'we write',(200,200),cv2.FONT_HERSHEY_COMPLEX,1,(0,0,255),)#图像、文本内容,绘制开始点,字体,比例尺,颜色,线宽度 cv2.imshow('putText01 image',img) cv2.putText(img,'we write',(200,200),cv2.FONT_HERSHEY_COMPLEX,1.5,(0,255,0),)#图像、文本内容,绘制开始点,字体,比例尺,颜色,线宽度 cv2.imshow('putText02 image',img) cv2.waitKey(0)#0代表无限延迟,数值代表延迟多少毫秒

在这里插入图片描述

五、透视变换 import cv2 import numpy as np img=cv2.imread(r'D:\Project\Opencv\Learning02\image02.png') cv2.imshow('oringin image',img) #定义四个点 width,height=250,350 pts1=np.float32([[98,189],[252,161],[135,419],[307,381]]) pts2=np.float32([[0,0],[width,0],[0,height],[width,height]]) #转换矩阵 matrix=cv2.getPerspectiveTransform(pts1,pts2) #转换后的图像 img_output=cv2.warpPerspective(img,matrix,(width,height)) cv2.imshow("warp image",img_output) cv2.waitKey(0)#0代表无限延迟,数值代表延迟多少毫秒

在这里插入图片描述

六、图像拼接 import cv2 import numpy as np img=cv2.imread(r'D:\Project\Opencv\Learning02\image01.png') cv2.imshow('oringin image',img) # #图像结合,水平(两图必须有相同的通道数) # hor=np.hstack((img,img)) # cv2.imshow("horizontal image",hor) # #图像结合,垂直(两图必须有相同的通道数) # ver=np.vstack((img,img)) # cv2.imshow("vertical image",ver) """函数能实现横向和垂直拼接,并且不要求通道数相同""" 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 ver imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) imgStack = stackImages(0.5,([img,imgGray,img],[img,img,img])) cv2.imshow('stack image',imgStack) cv2.waitKey(0)#0代表无限延迟,数值代表延迟多少毫秒

在这里插入图片描述

七、颜色检测 import cv2 import numpy as np #颜色检测原理:通过定义的颜色值范围(定义色相、饱和度等值的限制),检测图像中包含此种颜色的区域 #颜色检测难点:不能确定颜色值(H,S,V)的最大值最小值范围,我们需要使用跟踪杆(trackbar),不断调节H,S,V的各个值,找到最佳颜色最小值和最大值。 """颜色检测的步骤:1.找的合适的颜色范围(H/S/V)2.使用颜色范围创建颜色检测蒙版。3.使用蒙版检测原图像想要得到的颜色区域""" #创建一个新窗口,调整窗口大小 cv2.namedWindow('trackBars') cv2.resizeWindow('trackBars',640,240) '''(1)创建跟踪杆,寻找H/S/V的最佳值范围''' #创建跟踪杆(trackbar):#参数:trackbar的名称,放置该trackbar的窗口,初始值(当前值),最大值,调用函数(该函数每次在轨道上发生任何变化时都会运行) def empty(a): pass #初始跟踪杆,不断调整,找到能够检测到想要的颜色的H/S/V最佳范围值,本例值为0 19 110 241 154 255 # 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)#明度 # # #用最佳范围值初始化跟踪杆19 19 112 241 154 255 cv2.createTrackbar('hue min','trackBars',0,179,empty)#色相 cv2.createTrackbar('hue max','trackBars',19,179,empty)#色相 cv2.createTrackbar('sat min','trackBars',110,255,empty)#饱和度 cv2.createTrackbar('sat max','trackBars',241,255,empty)#饱和度 cv2.createTrackbar('val min','trackBars',154,255,empty)#明度 cv2.createTrackbar('val max','trackBars',255,255,empty)#明度 while True: img = cv2.imread(r'D:\Project\Opencv\Learning02\image04.png') imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 图像转HSV空间 # 读取跟踪栏(trackbar)将其应用于图像 h_min=cv2.getTrackbarPos('hue min','trackBars')#trackbar的名称,trackbar所在窗口 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') print(h_max,h_max,s_min,s_max,v_min,v_max) '''(2)利用颜色值范围,创建mask(蒙版)''' #创建mask掩码 lower=np.array([h_min,s_min,v_min]) upper=np.array([h_max,s_max,v_max]) mask=cv2.inRange(imgHSV,lower,upper)#图像,最小值,最大值 #调整各trackbar,找到最佳mask(能够检测出想要物体的)#本例中mask对应的值分别为0 19 110 241 154 255 '''(3)使用mask蒙版进行颜色检测''' #用mask得到作为原图蒙版检测到想要物体 imgResult=cv2.bitwise_and(img,img,mask=mask)#将两个图像加在一起创建信息图像。参数:原始图像,新图像,蒙版 cv2.imshow('oringin image', img) # cv2.imshow("HSV image", imgHSV) cv2.imshow("mask image", mask) cv2.imshow("result image", imgResult) cv2.waitKey(1) # 0代表无限延迟,数值代表延迟多少毫秒

在这里插入图片描述

八、轮廓、形状检测 import cv2 import numpy as np #轮廓检测 def getContours(): img = cv2.imread(r'D:\Project\Opencv\Learning02\image05.png') # 灰度转换 imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯平滑/模糊 imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 1) # 边缘检测 imgCanny = cv2.Canny(imgBlur, 50, 50) # 图像,阈值1,阈值2 """""" img_cnt=img.copy() """轮廓检测""" cloneImage,contours,Heriachy=cv2.findContours(imgCanny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)#参数:图像,检索模式(RETR_EXTERNAL是检索外部轮廓),检索方法 #轮廓保存在countours中 for cnt in contours: """(1)计算轮廓区域面积""" area=cv2.contourArea(cnt)#求轮廓面积 print('面积:',area) if area>10: """(2)绘制轮廓""" cv2.drawContours(img_cnt, cnt, -1, (255, 0, 0), 3) # 图像,轮廓,轮廓索引(因为绘制所有的轮廓,所以是-1),颜色,线宽度 '''(3)计算轮廓曲线长度''' peri=cv2.arcLength(cnt,True)#轮廓,封闭轮廓(True) print('周长',peri) '''(4)计算角点''' approx=cv2.approxPolyDP(cnt,0.02*peri,True)#图像,0.02*周长,封闭轮廓(True) print('角点:',approx,'角点个数:',len(approx))#根据每个闭合角点的个数就可以判断轮廓是什么形状 """(5)绘制外接矩形:根据角点""" x,y,w,h=cv2.boundingRect(approx)#根据角点得到边界矩形的左上角和宽和高 cv2.rectangle(img_cnt,(x,y),(x+w,y+h),(0,255,0),2)#绘制矩形,之前学习过 '''(6)图形分类''' objCor = len(approx) if objCor==3: ObjectType='Tri' elif objCor==4: ObjectType='Rec' else: ObjectType = 'Cir' # 绘制文本:图像,内容,起始点,字体,比例尺,颜色,缩放字体 cv2.putText(img_cnt,'{}'.format(ObjectType),(x+(w//2),y+(h//2)),cv2.FONT_HERSHEY_COMPLEX,0.5,(0,0,0),2) cv2.imshow('Contours image', img_cnt) cv2.imshow('oringin image', img) cv2.imshow('gray image', imgGray) cv2.imshow('Canny image', imgCanny) getContours() cv2.waitKey(0)

在这里插入图片描述

九、人脸检测

  opencv提供了一些默认的cascade,如果你想检测不同的东西,例车牌号,眼睛全身等,你可以下载这些级联。https://github.com/opencv/opencv/tree/master/data/haarcascades

import cv2 import numpy as np #添加级联,该xml是网址上下载的 faceCascade=cv2.CascadeClassifier(r'D:\Project\Opencv\Learning02\haarcascade_frontalface_default.xml') #读取原图 img = cv2.imread(r'D:\Project\Opencv\Learning02\image01.png') #灰度转换 imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #人脸检测 faces=faceCascade.detectMultiScale(imgGray,1.1,4)#图像,比例因子、最小邻域 #为面孔创建边界框 for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) cv2.imshow('face',img) cv2.waitKey(0)

在这里插入图片描述

十、实战 10.1 虚拟绘画

  需要找到颜色

import cv2 import numpy as np frameWidth = 640 frameHeight = 480 cap = cv2.VideoCapture(0) cap.set(3, frameWidth) cap.set(4, frameHeight) cap.set(10,150) #想要检测的颜色 myColors = [[5,107,0,19,255,255], [133,56,0,159,156,255], [57,76,0,100,255,255], [90,48,0,118,255,255]] #想要绘制的颜色 myColorValues = [[51,153,255], ## BGR [255,0,255], [0,255,0], [255,0,0]] #绘制的点的列表 myPoints = [] ## [x , y , colorId ] """获取想要绘制的,及对应的颜色""" def findColor(img,myColors,myColorValues): imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) count = 0 newPoints=[] for color in myColors: lower = np.array(color[0:3]) upper = np.array(color[3:6]) mask = cv2.inRange(imgHSV,lower,upper)#找到想要检测的颜色所在区域 x,y=getContours(mask)#想要绘制的点 cv2.circle(imgResult,(x,y),15,myColorValues[count],cv2.FILLED)#将点绘制在图上 if x!=0 and y!=0: newPoints.append([x,y,count])#将点添加到 newPoints列表中,count为想要绘制颜色的编号 count +=1 return newPoints#返回想要绘制的点的集合【x,y,颜色序号】 def getContours(img): cloneImage,contours,Heriachy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)#发现边缘 x,y,w,h = 0,0,0,0 for cnt in contours: area = cv2.contourArea(cnt) if area>500: #cv2.drawContours(imgResult, cnt, -1, (255, 0, 0), 3) peri = cv2.arcLength(cnt,True) approx = cv2.approxPolyDP(cnt,0.02*peri,True) x, y, w, h = cv2.boundingRect(approx)#轮廓的外接矩形 return x+w//2,y#轮廓外接矩形顶边的中点 """把点绘制在画布上""" def drawOnCanvas(myPoints,myColorValues): for point in myPoints: cv2.circle(imgResult, (point[0], point[1]), 10, myColorValues[point[2]], cv2.FILLED) while True: success, img = cap.read() imgResult = img.copy() newPoints = findColor(img, myColors,myColorValues)#想要绘制的点 if len(newPoints)!=0: for newP in newPoints: myPoints.append(newP) if len(myPoints)!=0: drawOnCanvas(myPoints,myColorValues)#将点绘制在画布上 cv2.imshow("Result", imgResult) if cv2.waitKey(1) & 0xFF == ord('q'): break 10.2 纸张扫描 import cv2 import numpy as np """图像预处理""" def preProcessing(img): imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度图 imgBlur = cv2.GaussianBlur(imgGray,(5,5),1)#高斯模糊 imgCanny = cv2.Canny(imgBlur,200,200)#边缘检测 kernel = np.ones((5,5))#结构元素 imgDial = cv2.dilate(imgCanny,kernel,iterations=2)#膨胀 imgThres = cv2.erode(imgDial,kernel,iterations=1)#腐蚀 return imgThres '''获取最大轮廓角点''' def getContours(img): biggest = np.array([]) maxArea = 0 #轮廓检测 cloneImage,contours,Heriachy= cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) for cnt in contours: #轮廓内面积 area = cv2.contourArea(cnt) if area>5000: #计算周长 peri = cv2.arcLength(cnt,True) #计算角点 approx = cv2.approxPolyDP(cnt,0.02*peri,True) #判断轮廓是否为矩形 if area >maxArea and len(approx) == 4: biggest = approx#获取最大的那个矩形框 maxArea = area#最大面积值更新 #绘制轮廓(biggest仅仅包含矩形的轮廓) cv2.drawContours(imgContour, biggest, -1, (255, 0, 0), 20) return biggest#返回最大轮廓 '''矩形角点的重新处理:按照一定的顺序排列(左上,右上,左下,右下)''' def reorder (myPoints): myPoints = myPoints.reshape((4,2))#四个角点 myPointsNew = np.zeros((4,1,2),np.int32) #点按照一定的顺序重新排列 add = myPoints.sum(1)#将点进行x+y计算, myPointsNew[0] = myPoints[np.argmin(add)] #和最小的点为左上角点 myPointsNew[3] = myPoints[np.argmax(add)]#和最大的点为右下角点 diff = np.diff(myPoints,axis=1)#将点进行x-y差异计算 myPointsNew[1]= myPoints[np.argmin(diff)]#差异最小的点为右上 myPointsNew[2] = myPoints[np.argmax(diff)]#差异最大的点为左下 return myPointsNew '''鸟瞰转换''' def getWarp(img,biggest):#参数:图像,四个角点 #矩阵角点的处理,按照一个统一顺序排列 biggest = reorder(biggest) # 点1 pts1 = np.float32(biggest) # 点2 pts2 = np.float32([[0, 0], [widthImg, 0], [0, heightImg], [widthImg, heightImg]]) #转换矩阵 matrix = cv2.getPerspectiveTransform(pts1, pts2) #鸟瞰图 imgOutput = cv2.warpPerspective(img, matrix, (widthImg, heightImg)) #得到的鸟瞰图,边缘有其他背景,所以裁剪边缘,,并将裁剪后的图像,重新调整为原来窗口大小。 imgCropped = imgOutput[20:imgOutput.shape[0]-20,20:imgOutput.shape[1]-20] imgCropped = cv2.resize(imgCropped,(widthImg,heightImg)) return imgCropped#返回鸟瞰图 '''图像堆叠显示''' 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 ver #创建视频捕获对象 cap = cv2.VideoCapture(1) cap.set(10,150) while True: # 读取视频帧 success, img = cap.read() # 调整图像大小 widthImg = 540 heightImg = 640 img = cv2.resize(img,(widthImg,heightImg)) # 复制图像 imgContour = img.copy() #图像预处理 imgThres = preProcessing(img) #获取轮廓的角点 biggest = getContours(imgThres) if biggest.size !=0: #鸟瞰转换 imgWarped=getWarp(img,biggest) imageArray = ([imgContour, imgWarped]) cv2.imshow("ImageWarped", imgWarped) else: imageArray = ([imgContour, img]) #图像堆叠显示 stackedImages = stackImages(0.6,imageArray) cv2.imshow("WorkFlow", stackedImages) if cv2.waitKey(1) & 0xFF == ord('q'): break 10.3 车牌检测器 import cv2 frameWidth = 640 frameHeight = 480 #下载级联xml下载地址https://github.com/opencv/opencv/tree/master/data/haarcascades nPlateCascade = cv2.CascadeClassifier("D:\Project\Opencv\Learning02\haarcascade_russian_plate_number.xml") minArea = 200 color = (255,0,255) #读取视频 cap = cv2.VideoCapture("video path") cap.set(3, frameWidth) cap.set(4, frameHeight) cap.set(10,150) count = 0 while True: success, img = cap.read()#视频帧读取 imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#灰度处理 #车牌检测 numberPlates = nPlateCascade.detectMultiScale(imgGray, 1.1, 10) for (x, y, w, h) in numberPlates: area = w*h if area >minArea: #绘制矩形 cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 255), 2) #绘制文字 cv2.putText(img,"Number Plate",(x,y-5),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,color,2) imgRoi = img[y:y+h,x:x+w] cv2.imshow("ROI", imgRoi) cv2.imshow("Result", img) if cv2.waitKey(1) & 0xFF == ord('s'): cv2.imwrite("Resources/Scanned/NoPlate_"+str(count)+".jpg",imgRoi) cv2.rectangle(img,(0,200),(640,300),(0,255,0),cv2.FILLED) cv2.putText(img,"Scan Saved",(150,265),cv2.FONT_HERSHEY_DUPLEX,2,(0,0,255),2) cv2.imshow("Result",img) cv2.waitKey(500) count +=1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3