赞
踩
使用opencv之前需要安装OpenCv
pip install opencv-python
图像的读取
import cv2 # 读取图像 image = cv2.imread('image.jpg') # 图像的保存, 第一个是路径, 后面的是要保存的图像 cv2.imwrite("d:\img", image) # 改变显示窗口的大小 """ windowName: 这是要调整大小的窗口的名称,通常是通过 cv2.namedWindow() 函数创建的窗口的名称。 width: 这是要设置的窗口的新宽度,以像素为单位。 height: 这是要设置的窗口的新高度,以像素为单位。 """ cv.resizeWindow(windowName, width, height) # 显示图像 cv2.imshow('Image', image) cv2.waitKey(0) cv2.destroyAllWindows()
[y1:y2, x1:x2] 代表了左上角和右下角的坐标
# 缩放图像
resized_image = cv2.resize(image, (width, height))
# 裁剪图像
cropped_image = image[y1:y2, x1:x2]
见代码
# 平移 img = cv2.imread("hu.png") # 读取图像 h, w, _ = img.shape # 获取图像的高度和宽度 # 创建平移矩阵 M,其中 (50, 100) 是 X 和 Y 轴上的平移量 M = np.float32([[1, 0, 50], [0, 1, 100]]) img = cv2.warpAffine(img, M, (w, h)) # 应用平移变换 cv2.imshow("12", img) # 显示结果图像 cv2.waitKey() # 等待用户按下任意键后关闭窗口 # 旋转 img = cv2.imread("hu.png") # 读取图像 h, w, _ = img.shape # 获取图像的高度和宽度 center = (h // 2, w // 2) # 计算图像中心坐标 # 创建旋转矩阵 M,其中 (center, 30, 0.8) 表示旋转角度为30度,缩放比例为0.8 M = cv2.getRotationMatrix2D(center, 30, 0.8) img = cv2.warpAffine(img, M, (w, h)) # 应用旋转变换 cv2.imshow("", img) # 显示结果图像 cv2.waitKey() # 等待用户按下任意键后关闭窗口 # 透视 img = cv2.imread("../day01/2333333.jpg") # 读取图像 h, w, _ = img.shape # 获取图像的高度和宽度 # 定义原图的四个点坐标 p1 和透视后的四个点坐标 p2 p1 = np.zeros((4, 2), np.float32) p1[0] = [0, 0] p1[1] = [w, 0] p1[2] = [0, h] p1[3] = [w, h] p2 = np.zeros((4, 2), np.float32) p2[0] = [600, 0] p2[1] = [w - 600, 0] p2[2] = [400, h] p2[3] = [w - 400, h] # 获取透视变换矩阵 M M = cv2.getPerspectiveTransform(p1, p2) img = cv2.warpPerspective(img, M, (w, h)) # 应用透视变换 cv2.imshow("", img) # 显示结果图像 cv2.resize(img, (600, 400)) # 调整图像大小(但未保存结果) cv2.waitKey() # 等待用户按下任意键后关闭窗口
(kernel_size, kernel_size) 是滤波核的大小,也称为卷积核或窗口大小。均值滤波核是一个正方形的矩阵,其大小由(kernel_size, kernel_size)指定,通常是一个奇数值,例如3x3、5x5等。滤波核的大小决定了滤波的程度,更大的核会导致更强烈的模糊效果。
# 高斯滤波
blurred_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)
# 均值滤波
blurred_image = cv2.blur(image, (kernel_size, kernel_size))
OpenCV 提供了多种边缘检测算法,其中最常用的是Canny边缘检测算法
import cv2 # 读取图像 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 以灰度模式读取图像 # 使用Canny边缘检测 # threshold1和threshold2是Canny算法的阈值,用于控制边缘检测的灵敏度。根据应用需求,你可以调整这两个阈值来获取适当的边缘检测结果。 edges = cv2.Canny(image, threshold1, threshold2) # 显示原始图像和边缘图像 cv2.imshow('Original Image', image) cv2.imshow('Edge Detection', edges) # 等待用户按下任意键后关闭窗口 cv2.waitKey(0) cv2.destroyAllWindows()
腐蚀 : 腐蚀操作可以缩小物体的边界,去除小的噪声点,以及分离连接的物体
import cv2 import numpy as np # 读取图像 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 以灰度模��读取图像 # 定义腐蚀核(结构元素) kernel = np.ones((5, 5), np.uint8) # 腐蚀操作 eroded_image = cv2.erode(image, kernel, iterations=1) # 显示原始图像和腐蚀后的图像 cv2.imshow('Original Image', image) cv2.imshow('Eroded Image', eroded_image) # 等待用户按下任意键后关闭窗口 cv2.waitKey(0) cv2.destroyAllWindows()
膨胀 :膨胀操作可以增加物体的边界,填充小的空洞,以及连接接近的物体
import cv2 import numpy as np # 读取图像 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 以灰度模式读取图像 # 定义膨胀核(结构元素) kernel = np.ones((5, 5), np.uint8) # 膨胀操作 dilated_image = cv2.dilate(image, kernel, iterations=1) # 显示原始图像和膨胀后的图像 cv2.imshow('Original Image', image) cv2.imshow('Dilated Image', dilated_image) # 等待用户按下任意键后关闭窗口 cv2.waitKey(0) cv2.destroyAllWindows()
HSV颜色空间 是一种用于表示图像中颜色的方式。HSV颜色空间是一种常用的颜色表示方式,它包括以下三个分量:
色相(H): 表示颜色的种类,通常以角度度量。0度对应红色,120度对应绿色,240度对应蓝色,等等。
饱和度(S): 表示颜色的饱和度或纯度。饱和度为0表示灰度图像,饱和度为1表示完全饱和的颜色。
亮度(V): 表示颜色的亮度。0表示黑色,1表示白色。
# 灰度化 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转HSV颜色空间 img = cv2.imread("234.jpg") # 把图片冲BGR空间装换为HSV空间 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 设定要过滤的颜色范围的下界和上界阈值 (这里设定为紫色范围) #上下限 low_hsv = np.array([125, 43, 46]) hign_hsv = np.array([155, 255, 255]) # 根据设定的颜色阈值,创建掩膜(将符合条件的像素设为白色,不符合条件的设为黑色) mask1 = cv2.inRange(hsv, lowerb=low_hsv, upperb=hign_hsv) cv2.imshow("",mask1) # 将原始图片与提取出的颜色部分进行按位与操作,得到提取出的颜色部分 color = cv2.bitwise_and(img, img, mask=mask1) # cv2.imshow("", color) cv2.waitKey()
cv2.VideoCapture 可以捕获摄像头,视频文件的话,直接指定好路径就行
import cv2 # 读取视频 video = cv2.VideoCapture("./demo.mp4") # 检查打开是否正确 if video.isOpened(): # video.read() 一帧一帧地读取,即一张图像一张图像的读取 # frame 得到当前这一帧的图像 open, frame = video.read() else: open = False # 当视频进行读取时 while open: ret, frame = video.read() # 如果读到的帧数不为空,那么就继续读取,如果为空,就退出 if frame is None: break if ret == True: # 转换为灰度图,这里COLOR_BGR2GRAY表示转为灰度图,想要其他的就用其他的就行 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow("video",gray) # 这里使用 waitKey 可以控制视频的播放速度,数值越小,播放速度越快 # 这里等于 27 也即是说按下 ESC 键即可退出该窗口 if cv2.waitKey(10) & 0xFF == 27: break video.release() cv2.destroyAllWindows()
以下代码使用Haar级联分类器来检测人脸,并做了贴图操作
import cv2 # 读取视频 cap = cv2.VideoCapture("18f.mp4") # 读取图片 img = cv2.imread("fensi.png", 1) # 获得视频帧的宽度和高度 w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 创建VideoWriter以保存输出视频 out = cv2.VideoWriter("1.avi", cv2.VideoWriter_fourcc("M", "J", "P", "G"), cap.get(cv2.CAP_PROP_FPS), (w, h)) # 初始化人脸级联分类器 classifier = cv2.CascadeClassifier() # 加载预训练的人脸级联分类器 classifier.load(r"haarcascade_frontalface_default.xml") # 遍历视频的每一帧 while cap.isOpened(): # 读取当前帧 r, frame = cap.read() if not r: # 如果没有读取到帧(视频结束),跳出循环 break # 将帧转换为灰度图 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 在帧中检测人脸 faces = classifier.detectMultiScale(gray) for x, y, w, h in faces: # 在人脸周围绘制红色矩形框 cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2) # 将帧和logo调整到与检测到的人脸矩形相同的尺寸 frame_h, frame_w, _ = frame.shape re_frame_h, re_frame_w, _ = img.shape new_h = int(h * frame_h / re_frame_h) new_w = int(w * frame_w / re_frame_w) logo = cv2.resize(img, (new_w, new_h)) try: # 在人脸区域上覆盖logo frame[y - new_h:y, x + 10:x + 10 + new_w] = logo except: pass continue # 显示带有人脸检测结果的帧 cv2.imshow("", frame) # 将帧写入输出视频 out.write(frame) # 如果按下空格键,跳出循环 if cv2.waitKey(20) & 0XFF == ord(" "): break # 释放视频捕获和视频写入对象,关闭窗口 out.release() cap.release() cv2.destroyAllWindows()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。