基于OpenCV的图形分析辨认01

news/2024/7/21 7:37:05 标签: opencv, 计算机视觉, python, pygame, numpy, 图像处理, vscode

目录

一、前言

二、实验目的

三、实验内容

四、实验过程


一、前言

编程语言: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("随机着色视频合成完成")

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

 

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


http://www.niftyadmin.cn/n/5411585.html

相关文章

SDM450核心板_高通SDM450安卓核心板模块性能参数

高通SDM450核心板是基于SDM450移动平台开发的一款高性能核心板。采用领先的14纳米技术,该核心板为高端智能设备提供了卓越的性能和优质的体验。板载2GB16GB的内存(可选配4GB32GB),双 ISP(图像传感器处理器)支持丰富的照片细节和双摄像头体验,…

JavaScript实现点击鼠标弹钢琴的效果

思路&#xff1a; 图片设置宽900px&#xff0c;找到鼠标按下时的x坐标和img距离body的x坐标&#xff0c;两个值相减&#xff0c;然后除100取整&#xff0c;赋值给a&#xff0c;通过判断a的值来确定放出那个音乐。 完整代码&#xff1a; <!DOCTYPE html> <html lan…

C# 在exe中启动另外一个exe时的关闭方法

在C#中&#xff0c;如果你想要从一个exe程序中启动另一个exe程序&#xff0c;并希望在需要时能够关闭它。 一、启动外部exe程序&#xff1a; 使用System.Diagnostics.Process启动程序&#xff0c;代码如下&#xff1a; private void btnStart_Click(object sender, RoutedEve…

RocketMQ架构详解

文章目录 概述RocketMQ架构Broker 高可用集群刷盘策略 概述 RocketMQ一个纯java、分布式、队列模型的开源消息中间件&#xff0c;前身是MetaQ&#xff0c;是阿里研发的一个队列模型的消息中间件&#xff0c;后开源给apache基金会成为了apache的顶级开源项目&#xff0c;具有高…

小白跟做江科大51单片机之LCD1602滚动显示效果

1.查看原理图 图1 LCD1602接口 图2 LCD1602与STC的接口 2.编写代码 图3 时序结构 根据时序结构编写命令和写入数据代码 #include <REGX52.H> #include "Delay.h" sbit LCD1602_ENP2^7; sbit LCD1602_RSP2^6; sbit LCD1602_WRP2^5; #define LCD1602_lCD0 …

探索c++——了解c++的魅力

前言&#xff1a;c是一门既面向对象又面向过程的语言。 不同于java纯粹的面向对象和c纯粹的面向过程。 造成c该特性的原因是c是由本贾尼大佬在c的基础上增添语法创建出来的一门新的语言。 它既兼容了c&#xff0c; 身具面向过程的特性。 又有本身的面向对象的特性。 面向对象和…

PaddleSeg分割框架解读[01] readme解读

简介 PaddleSeg是基于飞桨PaddlePaddle的端到端图像分割套件,内置45+模型算法及140+预训练模型,支持配置化驱动和API调用开发方式,打通数据标注、模型开发、训练、压缩、部署的全流程,提供语义分割、交互式分割、Matting、全景分割四大分割能力,助力算法在医疗、工业、遥…

怎么做加密文件二维码?分享文件更安全

怎么做一个加密文件二维码&#xff1f;在日常的工作和生活中&#xff0c;通过扫描二维码来查看或者下载文件的方式&#xff0c;被越来越多的人所使用&#xff0c;一方面是二维码的成本低&#xff0c;另一方面有利于提升便捷性和用户体验。 为了保证内容的隐私性和安全性&#…