一、OpenCV安装

在pycharm终端输入以下命令进行安装:

pip install opencv-contrib-python

安装成功如下所示:

 二、读取图片、视频

2.1 图片处理

通过cv2.imread()读取图片(相对路径/绝对路径),imshow()显示图片,imwrite()保存图片:

import cv2
#读取图片,相对路径
img = cv2.imread('opencv.jpg')
cv2.imshow('image', img)
cv2.waitKey(0)
#保存图像
cv2.imwrite('opencv_save.jpg', img)

#读取图片,绝对路径
base = 'D:/PycharmProjects/opencv/'
img = cv2.imread(base + 'opencv.jpg')
cv2.imshow('image', img)
cv2.waitKey(0)

 通过resize更改图片尺寸,上面是原图,下面是resize成100×100像素后的图片:

img = cv2.imread('opencv.jpg')
res = cv2.resize(img, (100, 100), interpolation=cv2.INTER_CUBIC)
cv2.imwrite('opencv_save.jpg', res)
cv2.imshow('image', res)
cv2.waitKey(0)

 2.2 视频处理

视频有两种读取方式,一种是电脑摄像头,一种是视频文件。使用while循环,读取视频一帧一帧读,再显示即可,cap.read()返回一个布尔值(True/False),如果帧读取的是正确的,就是True。所以最后你可以通过检查他的返回值来查看视频文件是否已经到了结尾。

import cv2

# 读取摄像头数据
# cap = cv2.VideoCapture(0)
# 读取视频文件
cap = cv2.VideoCapture('video.mp4')
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (width, height))

while True:
    # 读取一帧
    ret, frame = cap.read()
    # 如果没有读取到则退出
    if not ret:
        break
    # 显示
    cv2.imshow('frame', frame)
    # 写入文件
    out.write(frame)
    # 按下q键退出
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

在上述代码中,使用VideoWriter对象out、将读取的视频帧保存到输出视频文件output.mp4中。通过逐帧读取视频,对每一帧进行处理(如果需要),然后将处理后的帧通保存到输出视频文件中,最终得到一个MP4格式的视频

三、绘制图形和添加文字

常用的图形有线段、矩形、圆形、椭圆、多边形等,以下是绘制的函数及参数

cv2.line(img, start_point, end_point, color, thickness)
cv2.rectangle(img, top_left, bottom_right, color, thickness)
cv2.circle(img, center, radius, color, thickness)
cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness)
cv2.polylines(img, pts, isClosed, color, thickness)
#添加文字
cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)
import cv2
import numpy as np

# 创建一个512*512的图形,全为0,即黑色
img = np.zeros((512, 512, 3), np.uint8)
# 画一条线,起点(0,0),终点(511,511),颜色(0,0,255),线宽5
cv2.line(img, (0, 0), (511, 511), (0, 0, 255), 5)
# 画一个矩形,左上角(384,0),右下角(510,128),颜色(0,255,0),线宽3
cv2.rectangle(img,(384,0), (510,128), (0,255,0), 3)
# 画一个圆,圆心(256,256),半径50,颜色(255,0,0),线宽-1,表示填充
cv2.circle(img,(256, 256), 50, (255, 0, 0), -1)
# 画一个椭圆,圆心(256,256),长轴100,短轴50,旋转角度0,起始角度0,终止角度360,颜色(255,255,0),线宽3
cv2.ellipse(img,(256,256),(100,50),0,0,360,(255, 255, 0),3)
# 画一个多边形,四个点(10,5),(20,30),(70,20),(50,10),颜色(0,255,255),线宽3
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(img, [pts], True, (0, 255, 255))
# 在图像上添加文字,字体为cv2.FONT_HERSHEY_SIMPLEX,位置(10,500),字体大小4,颜色(255,255,255),线宽2
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2)

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

通过以上代码绘制得到的图形如下:

 四、图像操作

4.1 像素值

在 OpenCV 中,可以通过访问图像的像素来获取和修改像素值。OpenCV中图像被表示为多维数组,因此可以通过数组的索引来访问特定位置的像素。

import cv2

img = cv2.imread('cat.jpg')
print(img.shape)  # (1280, 1706, 3)
# 获取像素值
pixel = img[100, 100]
print(pixel)  # [189 195 230]
# 修改像素值
for i in range(1706):
    img[100, i] = [0, 0, 255]   
    img[200, i] = [0, 255, 0]
    img[300, i] = [255, 0, 0]

cv2.imshow('cat', img)
cv2.imwrite('cat_1.jpg', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.2 图像属性

在 OpenCV 中,可以通过访问图像的属性来获取有关图像的信息。以下是一些常用的图像属性:
1.图像尺寸:获取图像的高度和宽度。
2.通道数:对于彩色图像,通道数为3(BGR)。对于灰度图像,通道数为1。
3.数据类型:图像像素的数据类型,通常是`uint8`(8位无符号整数),`uint16`(16位无符号整数)等。
4,图像总像素数:图像中像素的总个数。

import cv2

image = cv2.imread("cat.jpg", cv2.IMREAD_COLOR)

if image is None:
    print("Failed to load the image.")
else:
    # 获取图像的高度和宽度
    height, width, _ = image.shape
    print("图像尺寸 (Height, Width): ({}, {})".format(height, width))

    # 获取图像的通道数
    num_channels = image.shape[2] if len(image.shape) == 3 else 1
    print("图像通道数: {}".format(num_channels))

    # 获取图像像素的数据类型
    data_type = image.dtype
    print("图像数据类型: {}".format(data_type))

    # 获取图像的总像素数
    total_pixels = image.size
    print("图像总像素数: {}".format(total_pixels))

图像尺寸 (Height, Width): (1280, 1706)
图像通道数: 3
图像数据类型: uint8
图像总像素数: 6551040

 4.3 ROI

ROI(Region of Interest)是指图像中的一个感兴趣区域,通常是指在图像中选择一个特定区域,该区域包含了我们感兴趣的目标或特征。通过定义 ROI,我们可以在图像中专注于特定区域,并对该区域进行进一步的处理、分析或操作。

import cv2

# 读取图像
image = cv2.imread("strawberry.jpg", cv2.IMREAD_COLOR)
print(image.shape)

# 定义ROI的区域(以矩形为例)
x, y, width, height = 700, 600, 300, 300
roi = image[y:y+height, x:x+width]

# 在图像中绘制矩形框来显示ROI区域
cv2.rectangle(image, (x, y), (x+width, y+height), (0, 255, 0), 2)

# 显示图像和ROI区域
cv2.imshow("Image with ROI", image)
cv2.imwrite("strawberry with roi.jpg", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 4.4 图像通道

在 OpenCV 中,可以通过拆分和合并图像通道来对彩色图像的通道进行处理。彩色图像通常由红色(R)、绿色(G)、蓝色(B)三个通道组成,每个通道都是灰度图像。要拆分彩色图像的通道,可以使用cv2.split() 方法。它将彩色图像拆分为各个通道的灰度图像,并返回一个包含这些灰度图像的列表。

import cv2

# 读取彩色图像
image = cv2.imread("opencv.jpg", cv2.IMREAD_COLOR)

# 拆分通道
b, g, r = cv2.split(image)

# 分别显示每个通道的图像
cv2.imshow("Blue Channel", b)
cv2.imshow("Green Channel", g)
cv2.imshow("Red Channel", r)

# 合并通道
img = cv2.merge([b, g, r])
cv2.imshow("Merged", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

 五、算数运算

图像的算术运算指的是对图像进行像素级别的数学运算。这些运算可以用于图像增强、图像融合、图像配准等应用。在 OpenCV 中,可以使用加法、减法、乘法、除法等算术运算来处理图像。

 5.1 加法

图像加法将两个图像的对应像素值相加。这在增加图像的亮度或将两个图像融合时很有用

image1 = cv2.imread("image1.jpg")
image2 = cv2.imread("image2.jpg")

# 确保两个图像具有相同的尺寸
image2_resized = cv2.resize(image2, (image1.shape[1], image1.shape[0]))

# 图像加法
result = cv2.add(image1, image2_resized)

5.2 减法

图像减法将两个图像的对应像素值相减。这在图像对齐或图像增强时有用

# 图像减法
result = cv2.subtract(image1, image2_resized)

5.3 混合

在 OpenCV 中,可以通过cv2.addWeighted()方法将两个图像以给定的权重混合,产生一个新的合成图像

import cv2

# 读取两个图像
image1 = cv2.imread("image1.jpg")
image2 = cv2.imread("image2.jpg")

# 确保两个图像具有相同的尺寸
image2_resized = cv2.resize(image2, (image1.shape[1], image1.shape[0]))

# 指定图像混合的权重(alpha为第一个图像的权重,beta为第二个图像的权重,gamma为混合后的偏置)
alpha = 0.5
beta = 0.5
gamma = 0

# 图像混合
blended_image = cv2.addWeighted(image1, alpha, image2_resized, beta, gamma)

# 显示混合后的图像
cv2.imshow("Blended Image", blended_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

 

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐