opencv中读取图片、视频以及对其基本操作

一、清华TUNA提供的Anaconda仓库镜像 

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes

二、图像读取与基本操作

在执行下述代码时,出现的问题有:

If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or config

解决的办法是,降低opencv-contrib-python==3.4.3.18.的版本:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn opencv-contrib-python==3.4.3.18

在解决问题中,大多是说,由于没有安装opencv-python或者是没有安装opencv-opencv-contrib-python,但是这两个模块均已近安装。

执行代码:

import cv2
import matplotlib.pyplot as plt
import numpy as np
# %matplotlib inline = plt.show
img = cv2.imread('cat.png')
print(img)
cv2.imshow("image",img)
# 等待时间,毫秒级,0表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

[[[255 255 255]
  [220 219 223]
  [109 116 131]....

并读取到图片:

e6232fcd81c24b7395edb9895c593c01.png

# 每次写上述的三行就比较的麻烦,于是定义如下的函数
def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(1000)cv2.destroyAllWindows()# 获取图像的属性,HWC
print(img.shape)
# 运行结果(158, 226, 3) 读取到的是一个RGB的彩色图# 读取灰度图像
img = cv2.imread('cat.png', cv2.IMREAD_GRAYSCALE)
print(img)
print(img.shape)
# 运行结果:[[255 220 119 ... 255 255 255]
#  [167  66  67 ... 186 255 255]
#  [ 65  65  67 ... 117 175 255]
#  ...
#  [ 97  96  97 ... 112 173 255]
#  [178  91  92 ... 186 255 255]
#  [255 224 135 ... 255 255 255]]
# (158, 226) 此处可以看到的是,只有了HW,变成灰度图像,只有两个中括号# 展示显示结果
或者:
cv_show('image',img)
cv2.imshow('image',img)
cv2.waitKey(1000)
cv2.destroyAllWindows()

显示的灰度图像:

2bad13b6f2354ce5a21864fa927d7c52.png

# 保存
cv2.imwrite('mycat.png', img)
print(type(img))
# 保存成功,运行结果:<class 'numpy.ndarray'>,注意在mycat中要加上.png# 展示尺寸 结果为:35708
print(img.size)# 数据类型 uint8
print(img.dtype)

三、视频的读取与基本操作

视频是图像静止的时间变化的。所以视频的处理就是一张一张的图像连接起来的。

第一步。将视频拆分成图像。

实例代码:

import cv2
import matplotlib.pyplot as plt# # 对视频的读取
vc =cv2.VideoCapture('test.mp4')
#
# # 每次写上述的三行就比较的麻烦,于是定义如下的函数
def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(1000)cv2.destroyAllWindows()# 检查打开是否是正确的,vc.read()循环检查每一张图像
if vc.isOpened():# open打开图像返回True,frame打开结果open, frame = vc.read()
else:open = False# 遍历每一帧,组成一个视频
while open:# 读取图片ret, frame = vc.read()# 若视频只有10秒,十秒之后,就为空,所以,如果读取为空,就跳出循环if frame is None:break# 如果读取的这一帧图像正确if ret ==True:# 将当前图像(frame)图像转化成黑白的gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 展示结果cv2.imshow('result', gray)# 操作完视频的速度if cv2.waitKey(50) & 0xFF ==27:break
vc.release()
cv2.destroyAllWindows()# 截取部分图像数据 ,结果就是显示部分的图像
img = cv2.imread('cat.png')
cat = img[0:100,0:200] # H=100,W=200
cv_show('cat',cat)# 颜色通道的提取
b,g,r = cv2.split(img)
print(b)
print(b.shape)
# 运行结果:[[255 220 109 ... 255 255 255]
#  [163  47  44 ... 178 255 255]
#  [ 43  45  44 ...  87 164 255]
#  ...
#  [ 66  62  63 ...  76 158 255]
#  [170  59  59 ... 175 255 255]
#  [255 222 118 ... 255 255 255]]
# (158, 226) shape 的结果都是一样的无论是哪一个通道# 拆开后组合在一起
img = cv2.merge((b, g, r))
print(img.shape)
# 结果:(158, 226, 3)# 只保留R R的索引值为2,GBR
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show('R', cur_img)# 只保留G G的索引值为0,GBR
cur_img = img.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv_show('G', cur_img)# 只保留B B的索引值为1,GBR
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv_show('B', cur_img)# 边界填充
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)
# BORDER_REPLICATE:复制发,复制的最边缘的像素
replicate = cv2.copyMakeBorder(img, top_size,  bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
# BORDER_REFLECT: 反射法,对感兴趣的图像图像中的像素,在两边进行复制
reflect = cv2.copyMakeBorder(img, top_size,  bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
# BORDER_REFLECT_101: 以最边缘像素为轴,对称
reflect101 = cv2.copyMakeBorder(img, top_size,  bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
# BORDER_WRAP:外包装法
wrap = cv2.copyMakeBorder(img, top_size,  bottom_size, left_size, right_size, cv2.BORDER_WRAP)
# BORDER_CONSTANT: 常数法,常数值填充
constant = cv2.copyMakeBorder(img, top_size,  bottom_size, left_size, right_size, cv2.BORDER_CONSTANT,value=0)plt.subplot(231), plt.imshow(img,'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate,'gray'), plt.title('replicate')
plt.subplot(233), plt.imshow(reflect,'gray'), plt.title('reflect')
plt.subplot(234), plt.imshow(reflect101,'gray'), plt.title('reflect101')
plt.subplot(235), plt.imshow(wrap,'gray'), plt.title('wrap')
plt.subplot(236), plt.imshow(constant,'gray'), plt.title('CONSTANT')
plt.show()# 数值计算img_cat = cv2.imread('cat.png')
img_dog = cv2.imread('dog.png')# 三个通道上,每一个都加10
img_cat2 = img_cat + 10
# 打印前五行
print(img_cat[:5, :, 0])
print(img_cat2[:5,: ,0])
# 运行结果:[[255 220 109 ... 255 255 255]
#  [163  47  44 ... 178 255 255]
#  [ 43  45  44 ...  87 164 255]
#  [ 46  46  45 ...  94  89 181]
#  [ 46  45  46 ...  95  94  93]]
# [[  9 230 119 ...   9   9   9]
#  [173  57  54 ... 188   9   9]
#  [ 53  55  54 ...  97 174   9]
#  [ 56  56  55 ... 104  99 191]
#  [ 56  55  56 ... 105 104 103]]
print((img_cat+img_cat2)[:5,: ,0])
# 运行结果:[[  8 194 228 ...   8   8   8]
#  [ 80 104  98 ... 110   8   8]
#  [ 96 100  98 ... 184  82   8]
#  [102 102 100 ... 198 188 116]
#  [102 100 102 ... 200 198 196]] 超过255的用大数%255得8
print(cv2.add(img_cat,img_cat2)[:5,: ,0]) #超过255取255,没有超过则取本身# 图像融合
# print(img_cat + img_dog) 图像得GBR不匹配
print(img_cat.shape)
print(img_dog.shape)# (158, 226, 3)
# (371, 500, 3)
img_dog = cv2.resize(img_dog,(226,158))
print(img_dog.shape)
# R=ax1+bx2+b 0.4就是权重a,0.6就是权重b,0就是偏置
res = cv2.addWeighted(img_cat,0.4, img_dog, 0.6, 0)
plt.imshow(cv2.cvtColor(res, cv2.COLOR_BGR2RGB))
plt.show()
# 拉伸
res = cv2.resize(img_dog, (0,0),fx = 3, fy=1)
plt.imshow(cv2.cvtColor(res, cv2.COLOR_BGR2RGB))
plt.show()
res = cv2.resize(img_dog,(0,0),fx = 1, fy=3)
plt.imshow(cv2.cvtColor(res, cv2.COLOR_BGR2RGB))
plt.show()

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1534980.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【EI会议末轮截稿通知】第三届电子信息技术国际学术会议(EIT 2024)

第三届电子信息技术国际学术会议&#xff08;EIT 2024&#xff09; The 3rd International Conference on Electronic Information Technology 重要信息 大会官网&#xff1a;www.ic-eit.net 三轮截稿时间&#xff1a;2024年9月16日23:59分&#xff08;后续不再征稿&#x…

【Hot100算法刷题集】双指针-01-移动零(含置零思路、移动思路、偏移量思路、冒泡法)

&#x1f3e0;关于专栏&#xff1a;专栏用于记录LeetCode中Hot100专题的所有题目 &#x1f3af;每日努力一点点&#xff0c;技术变化看得见 题目转载 题目描述 &#x1f512;link->题目跳转链接 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&…

企业数字化转型建设方案(数据中台、业务中台、AI中台)(可编辑的188页WORD)

引言&#xff1a;企业数字化转型是一个复杂而长期的过程&#xff0c;其核心在于通过数据中台、业务中台和AI中台的建设&#xff0c;推动企业实现全面的数字化升级。 方案介绍&#xff1a;企业数字化转型建设方案中的数据中台是企业数字化转型的核心基础设施&#xff0c;负责数…

Stream流的思想和获取Stream流

首先介绍流的概念&#xff1a; 流可以理解为一条流水线&#xff0c;在这条流水线中有许多操作&#xff0c;比如筛选所需要的数据&#xff0c;输出打印等&#xff0c; 经过这条流水线&#xff0c;可以获取到自己所需要的数据&#xff1a; -->所以&#xff1a; Stream流的作…

java项目之疫情下图书馆管理系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的疫情下图书馆管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息。 项目简介&#xff1a; 疫情下图书馆管理系…

USB虚拟串口——CDC ACM 虚拟串口(不使用 IAD)

文章目录 CDC ACM 虚拟串口实现描述符结构设备描述符配置描述符集合配置描述符接口 1 的描述符接口描述符类特殊描述符输入端点描述符接口 2 的描述符接口描述符输出端点描述符输入端点描述符类特殊请求set control line statusget line codingset line codingCDC 数据交互主机…

VirtualBox Install MacOS

环境搭建 git clone https://github.com/myspaghetti/macos-virtualbox 脚本配置 修改macos-guest-virtualbox.sh部分内容为 vm_name"macOS" # name of the VirtualBox virtual machine macOS_release_name"Catalina" # install &quo…

基于springboot的二手物品管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的二手物品管理系统9拥有三种角色 管理员&#xff1a;用户管理、卖家管理、分类管理、商品管理、订单管理、求购管理、留言管理等 用户&#xff1a;登录注册、购买、收藏、…

宴会中的白酒品鉴技巧,让你成为焦点人物

在宴会中&#xff0c;一杯白酒往往能成为连接人与人之间的纽带&#xff0c;而掌握白酒品鉴技巧&#xff0c;则能让你在觥筹交错间成为众人瞩目的焦点。今天&#xff0c;我们就来谈谈宴会中的白酒品鉴技巧&#xff0c;以豪迈白酒&#xff08;HOMANLISM&#xff09;为例&#xff…

ESP32开发 -- 初识

一、ESP32官网 ESP32官网 二、文档下载 用的是ESP32-S3-MINI-1&#xff0c;官网查看相关文档 相关文档 三、技术规格书 四、开发板 参看&#xff1a;ESP32-S3 系列开发板 ESP32-S3-MINI-1 相关开发板的示例代码&#xff0c;后续可以参考。 Espressif Systems esp-dev-…

BMP图片与VGA(HDMI)时序互转

1.BMP介绍 BMP&#xff08;Bitmap&#xff09;是一种用于存储位图图像的文件格式&#xff0c;广泛应用于 Windows 操作系统中。BMP 文件可以存储高质量的图像数据&#xff0c;包括颜色深度较高的图片&#xff0c;同时支持无压缩或可选的简单压缩方式。 BMP格式&#xff1a; …

【运维资料】网络监控运维管理解决方案(PPT原件完整版)

构建一体化运维监控平台的核心策略涵盖了几个关键维度&#xff0c;旨在打造一个高效、灵活且稳定的系统管理体系。首要任务是确立清晰的监控目标&#xff0c;这要求深入理解业务需求&#xff0c;确保监控范围覆盖关键性能指标、服务状态及潜在风险点。随后&#xff0c;整合现有…

Qt Model/View之代理

概念 与模型-视图-控制器模式不同&#xff0c;模型/视图设计没有包含一个完全独立的组件来管理与用户的交互。通常&#xff0c;视图负责向用户展示模型数据&#xff0c;并负责处理用户输入。为了在获取输入的方式上具有一定的灵活性&#xff0c;交互由委托执行。这些组件提供输…

C++---内存管理

1 C/C内存分布 栈区&#xff1a;由编译器自动分配和释放&#xff0c;存放运行时候的局部变量&#xff0c;函数参数&#xff0c;返回数据&#xff0c;返回地址。 堆区&#xff1a;一般由程序员自己分配&#xff0c;然后自己释放&#xff0c;例如栈的实现malloc开辟的数组空间。…

中秋假期用向日葵,临时工作需求远程控制随时解决

不知你是否在这美好时刻赏月看灯&#xff1f;有没有收到公司发的月饼呢&#xff1f; 在如今这个讲究降本增效的时代&#xff0c;仪式感早已变得稀少。公司发的月饼还没拆开&#xff0c;新消息就已弹出在公司群里。 此刻心里仿佛有万马奔腾&#xff0c;但很快又如湖水般平静&am…

拒绝千篇一律,AI帮你定制独一无二的个人写真

每个女人都渴望展现最美的自己&#xff0c;你是否厌倦了拍出千篇一律的照片&#xff1f;今天&#xff0c;我要告诉你一个秘密&#xff0c;用简单三步&#xff0c;即可打造属于你的独一无二个人写真&#xff01;文生图、蒙版换脸、图生图&#xff0c;三步化身超级模特&#xff0…

基于TRIZ的救援机器人轻量化设计

在救援机器人设计中&#xff0c;轻量化是一个至关重要的目标&#xff0c;它直接关系到机器人的便携性、运输效率以及在复杂环境中的作业能力。TRIZ理论为我们提供了一套系统化的工具和方法&#xff0c;用于解决设计过程中遇到的各种挑战&#xff0c;特别是在实现轻量化目标时&a…

初识爬虫4

1.理解代理ip&#xff0c;正向代理和反向代理 2.代理ip分类&#xff0c;根据匿名度分类&#xff1a;透明&#xff0c;匿名&#xff0c;高匿 3.防止频繁向同一个域名发送请求被封ip,需使用代理ip # -*- coding: utf-8 -*- import requestsurl https://www.baidu.comproxies {…

从关键新闻和最新技术看AI行业发展(第三十一期2024.8.26-9.8) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对其中的关键信息进行解读&#xff0c;力求让读者们能从容掌握AI科技潮流。 欢迎大家关注Rocky的公众号&#xff1a;WeThinkIn 欢迎大家关注Rocky的知乎&#xff1a;Rocky Ding AIGC算…

微型导轨加工环境需避免的隐患!

微型导轨是一种小巧精密的线性定位解决方案&#xff0c;其高速度、低噪音的特点使得它在现代制造业中扮演着越来越重要的角色。而微型导轨对于加工环境的要求主要体现在以下几个方面&#xff1a; 1、温度控制&#xff1a;加工环境需要保持在适宜的温度范围内&#xff0c;过高或…