基于OpenCV的图形分析辨认01

目录

一、前言

二、实验目的

三、实验内容

四、实验过程


一、前言

编程语言:Python,编程软件:vscode或pycharm,必备的第三方库:OpenCV,numpy,matplotlib,os等等。

关于OpenCV,numpy,matplotlib,os等第三方库的下载方式如下:

第一步,按住【Windows】和【R】调出运行界面,输入【cmd】,回车打开命令行。

第二步,输入以下安装命令(可以先升级一下pip指令)。

pip升级指令:

python -m pip install --upgrade pip

opencv库的清华源下载:

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

numpy库的清华源下载:

pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

matplotlib库的清华源下载:

pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

os库的清华源下载:

pip install os -i https://pypi.tuna.tsinghua.edu.cn/simple

二、实验目的

1.熟悉图像处理开发环境;

2.了解及完成图片读取及写出;

3.了解及完成视频数据读写及写出。

三、实验内容

1.任选一张彩色图及视频(5秒以内)完成课堂教授内容

2.使用下面公式将图片及视频转换成灰阶图,并将图及视频保存下来

Gray = (R + G + B) / 3

3.在彩色图及视频上随机地方著上(R,G,B) = (237, 28, 36)且大小为20 x 20 pixels的正方形,并将图及视频保存下来

四、实验过程

(1)本次实验的图片素材和视频素材如下:

图片命名为"img1.jpg",像素为450*450,图片样例如下所示:

视频命名为"video.mp4",像素为1280*720,视频样例如下所示:

(2)运用Gray = (R + G + B) / 3将图片和视频转化为灰阶图并保存

彩色图片转化为灰阶图并保存的代码如下所示:

python 复制代码
import cv2
import numpy as np

# 图像路径
img_path = r"D:\Image\img1.jpg"
# 读取图像
img = cv2.imread(img_path)
# 获取图像的高度和宽度
height, width = img.shape[:2]
# 创建相同大小但初始值为0的灰度图像
img_gray = np.zeros([height, width], img.dtype)

# 遍历图像的每一个像素点
for i in range(height):
    for j in range(width):
        # 获取像素点的RGB值
        img_values = img[i, j]
        # 计算RGB值的平均值并赋给灰度图像相应像素点
        img_gray[i, j] = int((img_values[0] + img_values[1] + img_values[2]) / 3)

# 展示灰度图像
cv2.namedWindow("img_gray", cv2.WINDOW_AUTOSIZE)
cv2.imshow("img_gray", img_gray)
# 等待按下任意键
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()
# 保存灰度图像
retval = cv2.imwrite(r"D:\Image\img1_gray.jpg", img_gray)

彩色视频转化为灰阶图并保存的代码如下所示:

python 复制代码
import cv2
import numpy as np
import os

# 打开视频文件
cap = cv2.VideoCapture(r"D:\Image\video.mp4")
currentframe = 0

# 循环读取视频帧并保存为图片
while (True):
    ret, frame = cap.read()
    if ret:
        name = str(currentframe)
        cv2.imwrite(r"D:\Image\video_img\%s.jpg"%name, frame)
        currentframe += 1
    else:
        break

# 释放视频对象
cap.release()

# 打开图片文件夹
video_img_path = r"D:\Image\video_img"

# 遍历图片文件夹中的所有图片
for img_name in os.listdir(video_img_path):
    img_path = video_img_path + "/" + img_name
    img = cv2.imread(img_path)
    height, width = img.shape[:2]
    # 转换为灰度图
    img_gray = np.zeros([height, width], img.dtype)
    for i in range(height):
        for j in range(width):
            img_values = img[i, j]
            img_gray[i, j] = int((img_values[0] + img_values[1] + img_values[2]) / 3)
    # 保存灰度图
    save_name = img_name.split(".")[0] + "_gray"
    retval = cv2.imwrite(r"D:\Image\video_img_gray\%s.jpg"%save_name, img_gray)
    print(f"第{save_name}张图片已保存")

print("灰阶图已保存完成")

原视频的彩色图片集如下,每一张图片的像素均为1280*720:

灰阶图的图片集如下:

将灰阶图的照片集重新制作成视频,代码如下:

python 复制代码
import cv2
import os

video_img_path = r"D:\Image\video_img_gray"
# 视频尺寸
img_size = (1280, 720)
# 获取所有图片文件
img_files = os.listdir(video_img_path)
# 图片数量
img_count = len(img_files)
# 视频编码
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# 保存视频的路径和名称
video_save = r"D:\Image\video_gray.mp4"
# 创建视频写入对象
video_writer = cv2.VideoWriter(video_save, fourcc, 60, img_size)
# 创建图片数组
img_array = []

for i in range(0, img_count):
    # 构建每张图片的路径
    img_path = video_img_path + "/" + str(i) + "_gray.jpg"
    # 读取每张图片
    img = cv2.imread(img_path)
    # 如果图片读取失败则跳过
    if img is None:
        continue
    img_array.append(img)

for j in range(0, img_count):
    # 调整图片大小
    img_array[j] = cv2.resize(img_array[j], img_size)
    # 将图片写入视频
    video_writer.write(img_array[j])
    print(f"第{j}张图片合成完成")

print("灰度视频合成完成")

(3)在彩色图及视频上随机地方著上(R,G,B) = (237, 28, 36)且大小为20 x 20 pixels的正方形,并将图及视频保存下来。

彩色图片的随机著色代码如下:

python 复制代码
import cv2
import random

# 指定图像路径
img_path = r"D:\Image\img1.jpg"
# 读取图像
img = cv2.imread(img_path)
# 获取图像的高度和宽度
height, width = img.shape[:2]
# 随机生成一个高度和宽度
height_random = random.randint(0, height - 20)
width_random = random.randint(0, width - 20)
# 绘制矩形框
cv2.rectangle(img, (width_random, height_random), (width_random + 20, height_random + 20), (237, 28, 36), -1)
# 创建窗口显示图像
cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存图像
retval = cv2.imwrite(r"D:\Image\img1_color.jpg", img)

彩色图片集的随机著色代码如下:

python 复制代码
import cv2
import random
import os

video_img_path = r"D:\Image\video_img"

for img_name in os.listdir(video_img_path):
    img_path = video_img_path + "/" + img_name
    img = cv2.imread(img_path)
    # 获取图像的高度和宽度
    height, width = img.shape[:2]
    # 随机生成一个高度和宽度
    height_random = random.randint(0, height - 20)
    width_random = random.randint(0, width - 20)
    # 绘制矩形框
    cv2.rectangle(img, (width_random, height_random), (width_random + 20, height_random + 20), (237, 28, 36), -1)
    save_name = img_name.split(".")[0] + "_color"
    retval = cv2.imwrite(r"D:\Image\video_img_color\%s.jpg"%save_name, img)
    print(f"第{save_name}张着色图片已保存")
    
print("所有图片已保存")

将随机着色后的图像集重新制作成视频,代码如下:

python 复制代码
import cv2
import os

video_img_path = r"D:\Image\video_img_color"
# 图像大小
img_size = (1280, 720)
# 视频保存路径
video_save = r"D:\Image\video_color.mp4"
# 获取图像文件列表
img_files = os.listdir(video_img_path)
# 图像数量
img_count = len(img_files)
# 视频编码
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# 创建视频写入对象
video_writer = cv2.VideoWriter(video_save, fourcc, 60, img_size)
# 创建图像数组
img_array = []

for i in range(0, img_count):
    # 构建图像路径
    img_path = video_img_path + "/" + str(i) + "_color.jpg"
    # 读取图像
    img = cv2.imread(img_path)
    # 如果图像为空,则跳过本次循环
    if img is None:
        continue
    img_array.append(img)

for j in range(0, img_count):
    # 调整图像大小
    img_array[j] = cv2.resize(img_array[j], img_size)
    # 将图像写入视频
    video_writer.write(img_array[j])
    print(f"第{j}张图片合成完成")

print("随机着色视频合成完成")

合成后的随机着色视频如下,与原视频时长和帧数相同:

都看到最后了,不点个赞吗?

相关推荐
m0_6174939429 分钟前
Python OpenCV 透视变换(Perspective Transform)详解与实战
开发语言·python·opencv
小李不困还能学32 分钟前
PyCharm下载安装与配置教程
ide·python·pycharm
博观而约取厚积而薄发41 分钟前
Pytest 从入门到精通,一篇就够(超详细实战教程)
python·测试工具·单元测试·自动化·pytest
imzed1 小时前
使用 Playwright + Pytest 构建 Web UI 自动化测试框架
python·自动化·pytest
普通网友1 小时前
pytest一些常见的插件
开发语言·python·pytest
时空系1 小时前
Python 高性能高压缩打包器 —— 基于 JianPy 语义分析引擎
python
知福致福1 小时前
vscode连接远程服务器登录codex插件一直卡在gpt图标页,不跳转浏览器登录
服务器·vscode·gpt
cndes1 小时前
给Miniconda换源,让包下载更迅速
开发语言·python
Metaphor6922 小时前
使用 Python 添加、隐藏和删除 PDF 图层
python·pdf·图层