ESC
输入关键词搜索文章
目录

毕业设计

本文不适用 auto-export-mode, 因为 auto-export 会自动执行所有的代码。

介绍

本库用于放置有关本人西安交通大学毕业设计相关的内容。

规划 [1/2]

开始

先确保我们处在正确的虚拟环境里:

which python

包管理

需要使用 cv2.

uv add opencv-python

边缘检测 - 图像

import cv2
import os

# 读取图像
image = cv2.imread('./imgs/test.png', cv2.IMREAD_GRAYSCALE)

# 使用Canny算法提取边缘
edges = cv2.Canny(image, 100, 200)  # 调整阈值以适应你的图像

# 保存边缘图像
cv2.imwrite('./imgs/edges_image.png', edges)

# 压缩边缘图像
cv2.imwrite('./imgs/compressed_edges.png', edges, [cv2.IMWRITE_JPEG_QUALITY, 50])  # 调整压缩质量

# 直接压缩原图像
cv2.imwrite('./imgs/compressed_original.png', image, [cv2.IMWRITE_JPEG_QUALITY, 50])  # 调整压缩质量

# 获取文件大小
edges_size = os.path.getsize('./imgs/compressed_edges.png')
original_size = os.path.getsize('./imgs/compressed_original.png')

# 输出结果
print(f"压缩后的边缘图像大小: {edges_size} 字节")
print(f"压缩后的原图像大小: {original_size} 字节")
print(f"Canny边缘提取对压缩的帮助: {original_size - edges_size} 字节")

边缘检测 - 视频

检查 OpenCV 是否支持 H.264

如果有以下内容就代表支持。

Video I/O:
  FFMPEG:                      YES
  avcodec:                     YES (58.134.100)
  avformat:                    YES (58.76.100)
  avutil:                      YES (56.70.100)
  swscale:                     YES (5.9.100)
import cv2
print(cv2.getBuildInformation())
import cv2
import os

# 读取视频文件
cap = cv2.VideoCapture('./videos/test.MOV')

if not cap.isOpened():
    print("无法打开视频文件")
    exit()

# 获取视频参数
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 创建视频写入对象(使用MJPG编码和JPEG压缩参数)
fourcc = cv2.VideoWriter_fourcc(*'avc1')
jpeg_params = [cv2.IMWRITE_JPEG_QUALITY, 50]

# 创建输出视频的写入器(边缘视频和压缩原视频)
out_edges = cv2.VideoWriter('./videos/edges_video.avi', fourcc, fps, (width, height))
out_original = cv2.VideoWriter('./videos/compressed_original.avi', fourcc, fps, (width, height))

# 设置视频写入器的压缩参数(OpenCV 4.5.5+支持)
out_edges.set(cv2.VIDEOWRITER_PROP_QUALITY, 50)
out_original.set(cv2.VIDEOWRITER_PROP_QUALITY, 50)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 将帧转换为灰度图像
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 边缘检测
    edges = cv2.Canny(gray_frame, 100, 200)

    # 将单通道边缘图像转换为三通道
    edges_bgr = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR)

    # 将灰度原图转换为三通道
    gray_bgr = cv2.cvtColor(gray_frame, cv2.COLOR_GRAY2BGR)

    # 写入处理后的帧
    out_edges.write(edges_bgr)
    out_original.write(gray_bgr)

# 释放资源
cap.release()
out_edges.release()
out_original.release()

# 获取文件大小
video_size = os.path.getsize('./videos/test.MOV')
edges_size = os.path.getsize('./videos/edges_video.avi')
original_size = os.path.getsize('./videos/compressed_original.avi')

# 输出结果
print(f"原始视频的大小:{video_size} 字节")
print(f"压缩后的边缘视频大小: {edges_size} 字节")
print(f"压缩后的原视频大小: {original_size} 字节")
print(f"Canny边缘提取对压缩的帮助: {original_size - edges_size} 字节")

日志