当前位置: 首页 > news >正文

OpenCv对图片视频的简单操作

目录

一.OpenCv安装与版本说明

二.图片的构成与颜色原理

三.OpenCv自动补齐功能修复

四.OpenCv的一些操作

1.基础操作

2.图片读取与灰度图转换

 3.图片保存

4.ROI(感兴趣区域)提取(切片操作)

5.视频加载与读取

①视频处理

②摄像头调用

③资源释放

6.RGB单通道提取方法

7.单通道显示与彩色效果

8.通道合并

9.图片的打码

10.图片的组合

11.图片的缩放(resize()方法)


一.OpenCv安装与版本说明

  • 需安装两个库:opencv-python 和 opencv-contrib-python,版本可以指定为 3.4.18.65
    pip install opencv-python==3.4.18.65 -i 镜像源地址
    pip install opencv-contrib-python==3.4.18.65 -i 镜像源地址
  • 不推荐使用最新版(4.x),因涉及版权问题且函数调用可能不兼容。

二.图片的构成与颜色原理

图片由像素点组成,每个像素点颜色由 RGB 三通道数值(0-255)决定。

三.OpenCv自动补齐功能修复

四.OpenCv的一些操作

1.基础操作

  • 问题现象:代码自动补齐失效(黄色框或下划线提示)。
  • 原因:OpenCV 版本过低。
  • 解决方法:
    1. 找到 Python 安装路径下的 site-packages 文件夹(如 D:\PY\site-packages)。
    2. 进入 cv2 文件夹,复制 cv2.pyd 文件到上层目录(site-packages 文件夹内)。
    3. 重启 Python 环境即可恢复自动补齐功能。
  • 查询 Python 安装路径的命令:win + R 输入 cmd,执行 where python
  • 读取图片:使用 cv2.imread(),参数为图片路径(避免中文路径)。
  • 显示图片:使用 cv2.imshow() 和 cv2.waitKey(),后者控制窗口显示时长(单位毫秒,0 表示无限等待)。
  • 关闭窗口cv2.destroyAllWindows() 释放内存。
  • 图片属性:通过调试模式查看图片的 shape(高、宽、通道数)、dtype(数据类型,如 uint8)、size(总像素数)。
    import cv2im=cv2.imread('img1.png')
    cv2.imshow('img1',im)
    asic=cv2.waitKey(10000)#我们可以通过任意键关闭,比如按下空格键就会返回空格键的ascii码值32
    print(asic)#32
    cv2.destroyAllWindows()
    print('图片形状(shape):',im.shape)
    print('图片数据类型(dtype):',im.dtype)
    print('图片大小(size):',im.size)图片形状(shape): (864, 1536, 3)
    图片数据类型(dtype): uint8
    图片大小(size): 3981312
    

注意事项:

  • OpenCV 中通道顺序为 BGR(非 RGB),中文路径或窗口名可能导致乱码或报错。
  • 按键 ASCII 码可通过 cv2.waitKey() 获取(如 ESC 键为 27)。

2.图片读取与灰度图转换

  • 灰度图特点:单通道(无色彩),像素值范围 0(黑)到 255(白),数据量为彩色图的 1/3。
  • 转换方法:
    • 使用 cv2.imread()方法读取图片 时添加参数 cv2.IMREAD_GRAYSCALE 或简写为 0
  • 优势:减少计算量且保留特征(如形状、轮廓)。
import cv2
# 读取图片灰度图
im = cv2.imread('img1.png',cv2.IMREAD_GRAYSCALE)
# 或者im = cv2.imread('img1.png',0)
cv2.imshow('image1_gray',im)
cv2.waitKey(0)
cv2.destroyAllWindows()
print('图片形状(shape):',im.shape)
print('图片数据类型(dtype):',im.dtype)
print('图片大小(size):',im.size)

 3.图片保存

  • 方法:cv2.imwrite(文件名, 图片数据),如 cv2.imwrite("tmp98_gray.jpg", gray_image)
cv2.imwrite('image1_gray.png',im)
  • 注意:需先关闭 cv2.waitKey() 窗口(按任意键)才能执行保存操作。

4.ROI(感兴趣区域)提取(切片操作)

  • 作用:从图像中截取特定区域(如人脸识别时仅分析人脸部分)。
  • 实现:通过数组切片(如 image[30:230, 100:300] 截取行 30-230、列 100-300 的矩形区域)。
  • 限制:仅支持矩形区域,无法按轮廓裁剪。
# 切片图片部分内容
a=im[100:500,200:700]
cv2.imshow('img1',im)
cv2.imshow('a',a)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.视频加载与读取

  • 使用 OpenCV 的 cv2.VideoCapture() 方法加载本地视频文件,支持中文字符路径。
  • 视频播放通过循环逐帧读取(video_capture.read()),每帧画面显示时长由 cv2.waitKey() 参数控制(默认60毫秒)。
  • 播放速度可通过调整 waitKey 参数修改(如1000毫秒为慢速,1毫秒为快速)。
  • 视频窗口可以设置按 ESC 键(ASCII值27)关闭。
import cv2
# video_capture = cv2.VideoCapture(0)
video_capture = cv2.VideoCapture('zqt.mp4')
if not video_capture.isOpened():print('视频打开失败')exit()while True:#逐帧读取视频ret,frame=video_capture.read()# 检查是否成功读取if not ret:break# frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)cv2.imshow('video',frame)if cv2.waitKey(100)==27:break
video_capture.release()
cv2.destroyAllWindows()

①视频处理

  • 将视频转换为灰度图:
    • 方法1:通过 cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 逐帧转换。
    • 方法2:加载时直接使用 cv2.IMREAD_GRAYSCALE 参数(需注意与第一种方法的参数区别)。
  • 处理逻辑可插入在读取帧(frame)与显示之间,例如人脸检测等。

②摄像头调用

  • 将 VideoCapture 参数改为 0 可调用本地摄像头,支持多摄像头切换(如0、1、2)。

③资源释放

  • 视频处理完成后需调用 video_capture.release() 释放资源,避免内存占用过高。
  • 关闭所有窗口使用 cv2.destroyAllWindows()

6.RGB单通道提取方法

  • 方法一:数组切片
    • 使用冒号切片(如a[:,:,0])提取通道,索引0为B通道,1为G通道,2为R通道。
    • 提取后的单通道图像为灰度图,无色彩。
      import cv2
      img=cv2.imread('img1.png')
      b=img[:,:,0]
      g=img[:,:,1]
      r=img[:,:,2]
  • 方法二:split函数
    • 直接调用cv2.split(a)返回B、G、R三个通道的数组,效果与方法一相同
b,g,r=cv2.split(img)

7.单通道显示与彩色效果

  • 显示单通道时图像为灰度,因仅保留亮度值。
  • 若需显示单通道彩色效果(如仅蓝色),需将其他通道数值设为0(如img[:,:,1:3]=0保留B通道)。
  • 操作时建议使用copy()避免修改原图数据
#设置单颜色
new_img=img.copy()
new_img[:,:,1]=0
new_img[:,:,2]=0
cv2.imshow('new_img',new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

8.通道合并

  • 使用cv2.merge([B,G,R])将分离的通道合并为彩色图像,合并后恢复原图效果。
b,g,r=cv2.split(img)
# 合并颜色通道
res=cv2.merge((b,g,r))#注意参数是元组形式
cv2.imshow('res',res)

9.图片的打码

使用 OpenCV 和 NumPy 实现指定区域马赛克效果

  • 步骤:读取图片 → 选定区域(如200-300行、150-250列) → 用随机生成的像素值(0-255)替换原区域 → 显示结果。
  • 关键点:区域大小需与随机生成的数组维度一致(如100x100x3对应RGB三通道)。
import numpy as np
import cv2
new_img[200:300,150:250]=np.random.randint(0,256,(100,100,3))
cv2.imshow('new_img_dama',new_img)
cv2.waitKey(10000)
cv2.destroyAllWindows()

10.图片的组合

基于区域选择(ROI)将两张图片的指定区域融合。

  • 示例:将图片的100-250行、200-350列区域替换到另一图片的200-350行、300-450列区域。
  • 注意:抠图区域大小需严格一致(如150x150)。
#图片的组合
img2=cv2.imread('nailong.png')
img1[100:250,200:350]=img2[200:350,300:450]#注意组合的距离要相同
cv2.imshow('img1_combine',img1)
cv2.waitKey(10000)
cv2.destroyAllWindows()

11.图片的缩放(resize()方法)

  • 指定宽高:直接设置目标尺寸(如宽200、高600),图片按比例拉伸。
  • 比例系数:通过fx(横向比例)和fy(纵向比例)调整(如0.5倍缩小或1.5倍放大)。
#图片的大小调整
img1=cv2.imread('img1.png')
new_img=cv2.resize(img1,dsize=None,fx=0.5,fy=0.5)
#或者
# new_img=cv2.resize(img,dsize=(200,600))
cv2.imshow('new_img',new_img)
cv2.waitKey(10000)
cv2.destroyAllWindows()

http://www.lryc.cn/news/612715.html

相关文章:

  • Flutter 局部刷新方案对比:ValueListenableBuilder vs. GetBuilder vs. Obx
  • PPT漏斗图,让数据更美观!
  • OpenAI重磅发布:GPT最新开源大模型gpt-oss系列全面解析
  • 【沉浸式解决问题】mysql-connector-python连接数据库:RuntimeError: Failed raising error.
  • 计算机视觉(opencv)——图像本质、数字矩阵、RGB + 基本操作(实战一)
  • Java面试宝典:JVM的垃圾收集算法
  • Linux中chmod命令
  • JAVA,Maven分模块设计
  • 初识C++类的6个默认成员函数
  • 模拟-38.外观数列-力扣(LeetCode)
  • 【数据库】如何从本地电脑连接服务器上的MySQL数据库?
  • 国内主流数据集成厂商有哪些?有那些免费的数据集成平台?
  • 【Java】Predicate使用案例
  • 【CS创世SD NAND征文】额贴式睡眠监测仪的数据守护者:存储芯片如何实现7×24小时安眠状态下的全时稳定记录
  • Nuclei漏洞扫描工具(除了常见漏洞还支持CMS常见漏洞Gitlab、Jira、Splunk、Elastic)
  • 2025年主流开源音视频播放项目深度解析
  • Java技术栈/面试题合集(20)-运维与线上问题排查篇
  • nvm安装,nvm管理node版本
  • 【数据结构初阶】--排序(五)--计数排序,排序算法复杂度对比和稳定性分析
  • MATLAB科研数据可视化
  • 【CDA案例】数据分析案例拆解:解锁数据分析全流程!
  • 图像认知与OpenCV——图像预处理4
  • 计算机视觉--opencv(代码详细教程)
  • Java垃圾回收(GC)探析
  • 网络可视,运维无忧:分钟级定位,告别盲目扩容
  • 华为开源CANN,再次释放“昇腾转向”信号
  • spring boot学习计划
  • Qt: WA_DontCreateNativeAncestors
  • QT5.15 mingw
  • qt的元对象系统详解