OpenCV操作

本文详细介绍OpenCV库的使用,包括图像和视频处理的基本操作,如读取、显示、保存图像,加载视频源,以及在图像上进行绘制和写字。此外,还介绍了图像操作、阈值设定、颜色过滤、边缘检测等高级功能,最后展示了如何使用HaarCascades进行面部检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenCV介绍

OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定。 OpenCV 用于各种图像和视频分析,如面部识别和检测,车牌阅读,照片编辑,高级机器人视觉,光学字符识别等等
OpenCV 有一些操作,如果没有完整安装 OpenCV (大小约 3GB),你将无法完成,但是实际上你可以用 python-OpenCV 最简安装。

需要安装3个库:python-OpenCV,Numpy 和 Matplotlib

读写图像

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('xx.jpg',cv2.IMREAD_GRAYSCALE)    #cv2.read(image file, parms), 默认是IMREAD_COLOR,也可以使用-1,0或1。颜色为1,灰度为0,不变为-1
cv2.imshow('tittle',img)

cv2.waitKey(0)              # 0=forever, 知道按键输入
cv2.destroyAllWindows()
CV2.imwrite('..path/xx.jpb', img)

加载视频源

import numpy as np
import cv2
cap = cv2.VideoCapture(0)                          # 0=计算机上的第一个网络摄像头返回视频
while(True): 
	ret, frame = cap.read() 
	gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #转换为灰度的帧
	cv2.imshow('title',gray) 
	if cv2.waitKey(1) & 0xFF == ord('q'):          #这个语句每帧只运行一次。 基本上,如果我们得到一个按键,那个键是q
		break
cap.release()                                      #释放网络摄像头
cv2.destroyAllWindows()                            #关闭所有的imshow()窗口

在某些情况下,你可能实际上需要录制,并将录制内容保存到新文件中。 以下是在 Windows 上执行此操作的示例:

import numpy as np
import cv2
cap = cv2.VideoCapture(1)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(True): 
	ret, frame = cap.read() 
	gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
	out.write(frame)                               #out.write()来输出帧
	cv2.imshow('frame',gray) 
	if cv2.waitKey(1) & 0xFF == ord('q'): 
		break
cap.release()
out.release()
cv2.destroyAllWindows()

在图像上绘制和写字

cv2.line(img,(0,0),(150,150),(255,255,255),15)     #绘制线段
#cv2.rectangle(img,(15,25),(200,150),(0,0,255),15)
#cv2.circle(img,(100,63), 55, (0,255,0), -1)
#pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)

font = cv2.FONT_HERSHEY_SIMPLEX                   #设置字体
cv2.putText(img,'OpenCV Tuts!',(0,130), font, 1, (200,255,155), 2, cv2.LINE_AA)  #输出文字

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像操作

在 OpenCV 中,我们将介绍一些我们可以做的简单图像操作。 每个视频分解成帧。 然后每一帧,就像一个图像,分解成存储在行和列中的,帧/图片中的像素。 每个像素都有一个坐标位置,每个像素都由颜色值组成。 让我们列举访问不同的位的一些例子

import cv2
import numpy as np
img = cv2.imread('watch.jpg',cv2.IMREAD_COLOR)
px = img[55,55]                       # 引用特定像素
img[55,55] = [255,255,255]            # 修改像素值
img[100:150,100:150] = [255,255,255]  # 修改ROI(region of interest感兴趣图像区域)

print(img.shape)                      # 图像的属性
print(img.size)
print(img.dtype)

阈值

手动设定阈值,cv2.threshold,灰度图元素二值化,大于127赋值255,否则赋值0

import cv2
import numpy as np
img = cv2.imread('xx.jpg')
retval, threshold = cv2.threshold(img,127, 255,cv2.THRESH_BINARY)
cv2.imshow('original',img)
cv2.imshow('threshold',threshold)
cv2.waitKey(0)
cv2.destroyAllWindows()

接下来,我们可以尝试自适应阈值,这将尝试改变阈值

import cv2
import numpy as np
th = cv2.adaptiveThreshold(grayscaled, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1)
cv2.imshow('original',img)
cv2.imshow('Adaptive threshold',th)
cv2.waitKey(0)
cv2.destroyAllWindows()

颜色过滤

模糊和平滑

形态变化

边缘检测和渐变

import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while(1): 
	frame = cap.read() 
	hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
	lower_red = np.array([30,150,50]) 
	upper_red = np.array([255,255,180]) 
	mask = cv2.inRange(hsv, lower_red, upper_red) 
	res = cv2.bitwise_and(frame,frame, mask= mask) 
	laplacian = cv2.Laplacian(frame,cv2.CV_64F) 
	sobelx = cv2.Sobel(frame,cv2.CV_64F,1,0,ksize=5) 
	sobely = cv2.Sobel(frame,cv2.CV_64F,0,1,ksize=5) 
	cv2.imshow('Original',frame) 
	cv2.imshow('Mask',mask) 
	cv2.imshow('laplacian',laplacian) 
	cv2.imshow('sobelx',sobelx) 
	cv2.imshow('sobely',sobely) 
	k = cv2.waitKey(5) & 0xFF if k == 27: 
		break
	cv2.destroyAllWindows()cap.release()

模板匹配

import cv2
import numpy as np
img_rgb = cv2.imread('opencv-template-matching-python-tutorial.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('opencv-template-for-matching.jpg',0)
w, h = template.shape[::-1]

到目前为止,我们加载了两个图像,转换为灰度。 我们保留原始的 RGB 图像,并创建一个灰度版本。
我们确实要选择一个阈值,其中某种东西可能是 80% 匹配,那么我们说这就匹配

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
#找到res大于或等于 80% 的位置
for pt in zip(*loc[::-1]): 
	cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,255,255), 2)
	cv2.imshow('Detected',img_rgb)

GrabCut 前景提取

MOG 背景减弱

我们将要讨论如何通过检测运动来减弱图像的背景。 这将要求我们回顾视频的使用,或者有两个图像,一个没有你想要追踪的人物/物体,另一个拥有人物/物体

Haar Cascade 面部检测

Haar Cascades 对象检测。我们将从脸部和眼睛检测来开始。为了使用层叠文件进行对象识别/检测,首先需要层叠文件。对于非常流行的任务,这些已经存在。检测脸部,汽车,笑脸,眼睛和车牌等东西都是非常普遍的

你可以在 Haar Cascades 的根目录找到更多。请注意用于使用/分发这些 Haar Cascades 的许可证。
假设你已经从上面的链接中下载了haarcascade_eye.xml和haarcascade_frontalface_default.xml,并将这些文件放在你项目的目录中

import numpy as np
import cv2
# multiple cascades: https://github.com/Itseez/opencv/tree/master/data/haarcascades
#https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_eye.xml
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
cap = cv2.VideoCapture(0)

while 1: 
	ret, img = cap.read()
	gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
	faces = face_cascade.detectMultiScale(gray, 1.3, 5)  # 传入参数分别为:image源, scaleFactor 1.3, minNeighbors=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: 
			cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

		cv2.imshow('img',img) 
	if cv2.waitKey(30) & 0xff == ord('q'):
		break
	cap.release()
	cv2.destroyAllWindows()

创建自己的 Haar Cascade

添加链接描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值