【OpenCV学习】初识OpenCV其二

图片分割和图片合成(大图切割成小图,python代码) 目录 分割 拼接 由于后面要进行图片的分割,所以就先做了一些准备。 要分割的图片如下: 分割 思路也比较简单,代码注释比较详细,看代码就行。 from cv2 import cv2 import numpy as np pic_path = 'd:/Python/cut_pic/picture/3_result.jpg' # 分割的图片的位置 pic_target = 'D:/Python/cut_pic/result/' # 分割后的图片保存的文件夹 #要分割后的尺寸 cut_wid 阅读详情

🌈据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。

前言:
🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~
✨个人主页:点我直达,在这里肯定能找到你想要的~
👍专栏介绍:OpenCV从入门到放弃 ,一个学习OpenCV的专栏~

专栏文章直链:
【OpenCV学习】初识OpenCV人生苦短,我用python

保存图片

在上一章节,说了读取图片,接下来可以保存图片

from cv2 import cv2
# 默认是按照彩色图片来读取的。
cat = cv2.imread('./cat.jpeg')
cv2.imwrite('./123.png', cat)

imwrite 就是保存图片(写入图片)的意思。

采集摄像头视频

首先我们先要了解视频的本质。
我们常常听到说,电影是24帧的, 游戏30帧玩起来有点卡,流畅的话至少要60帧…
其实这些都是视频,帧率的意思就是,每秒钟播放几张图片。
通常帧率越高,看起来越流畅,但高到了一定程度,人眼就分辨不出来了。
所以视频其实本质上就是由一幅一幅的图片组成的。

import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('window', 640, 480)
# 如果打开失败,不会报错。
# cap = cv2.VideoCapture(1)
cap = cv2.VideoCapture(0)

这样我们就获取到了一个摄像头对象 cap 。
接下来我们通过循环 cap.isOpened() 判断摄像头有没有被关闭,达到不断刷新窗口的效果:

import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('window', 640, 480)
# 如果打开失败,不会报错。
# cap = cv2.VideoCapture(1)
cap = cv2.VideoCapture(0)
# 循环读取谁想投的每一帧。
# while True:
while cap.isOpened():
    # 读一帧数据,返回标记和这一帧数据,True表示读到了数据,False表示没读到数据。
    ret, frame = cap.read()
    # 可以根据ret做个判断。
    if not ret:
        # 没读到数据,直接退出。
        break
    # 显示数据
    cv2.imshow('video', frame)
    key = cv2.waitKey(10)
    if key & 0XFF == ord('q'):
        break
# 别忘了释放资源
cap.release()
cv2.destroyAllWindows()

这样一个过程就是循环读取摄像头的每一帧,读取速度将依据 cv2.waitKey 设置的等待超时时长决定。
当然这边的时间设置还是有点夸张的,10毫秒获取一张图片,相当于是100帧这种速度,我们不需要这么快:

import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('window', 640, 480)
# 如果打开失败,不会报错。
# cap = cv2.VideoCapture(1)
# 打开视频,输入视频的地址
cap = cv2.VideoCapture('./1.mp4')
# 循环读取谁想投的每一帧。
# while True:
while cap.isOpened():
    # 读一帧数据,返回标记和这一帧数据,True表示读到了数据,False表示没读到数据。
    ret, frame = cap.read()
    # 可以根据ret做个判断。
    if not ret:
        # 没读到数据,直接退出。
        break
    # 显示数据
    cv2.imshow('video', frame)
    # 假如一个视频是30帧,那么每张图之间要间隔多少毫秒。
    # 只能是整数
    key = cv2.waitKey(1000 // 30)
    if key & 0XFF == ord('q'):
        break
# 别忘了释放资源
cap.release()
cv2.destroyAllWindows()

现在换上 1000 // 30 就表明我们现在的帧率差不多是30帧了。

视频录制

在上面打开摄像头的基础上,可以将视频录制下来~

from cv2 import cv2
cv2.namedWindow('frame', cv2.WINDOW_NORMAL)
cv2.resizeWindow('frame', 640, 480)
cap = cv2.VideoCapture(0)
# *mp4就是解包操作,等同于  'm', 'p', '4', 'v'
# fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# avi格式的视频
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 创建videowriter
# vw = cv2.VideoWriter('output.mp4', fourcc, 30, (640, 480))
vw = cv2.VideoWriter('output.avi', fourcc, 30, (640, 480))
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    # 写每一帧数据
    vw.write(frame)
    cv2.imshow('frame', frame)
    if cv2.waitKey(1000 // 30) == ord('q'):
        break
# 别忘了release
cap.release()
vw.release()
cv2.destroyAllWindows()

关于 *“字符串” 这个解包操作,就是将字符串分成多个字符,由一个参数变成多个参数的过程,这里举几个小栗子,sep='|' 的意思是将多个接收参数当中用 | 分隔开来:

在这里插入图片描述

很明显解包的作用就显现出来了。
这是博主使用摄像头录制的视频(转换成了GIF文件,露脸是不可能的~):
在这里插入图片描述

鼠标检测

作为图像处理套件,怎么能少了对窗口的控制呢?
他既能等待键盘输入,又能检测鼠标状态:

from cv2 import cv2
import numpy as np


# 函数名可以随便取,但是参数必须是5个
# event表示鼠标事件,x,y是鼠标的坐标
# flags鼠标的组合按键.
def mouse_callback(event, x, y, flags, userdata):
    print(event, x, y, flags, userdata)
    if event == 2:
        cv2.destroyAllWindows()


# 创建窗口
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
# 宽度和高度
cv2.resizeWindow('mouse', 640, 360)
# 设置鼠标回调函数
cv2.setMouseCallback('mouse', mouse_callback, '123')
# 生成全黑的图片
img = np.zeros((360, 640, 3), np.uint8)
while True:
    cv2.imshow('mouse', img)
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
cv2.destroyAllWindows()

这里通过 numpy 生成全黑背景,然后鼠标的每一次移动,都会传递五个参数到 mouse_callback 这个回调函数上。
其中 x,y 是鼠标的窗口坐标,userdata 为用户数据,方便回调函数知道这是哪里产生的回调。
然后 event 是鼠标事件,flags 是鼠标的组合按键,总结如下:

  • 鼠标事件
    • EVENT_MOUSEMOVE 0 鼠标移动
    • EVENT_LBUTTONDOWN 1 按下鼠标左键
    • EVENT_RBUTTONDOWN 2 按下鼠标右键
    • EVENT_MBUTTONDOWN 3 按下鼠标中键
    • EVENT_LBUTTONUP 4 左键释放
    • EVENT_RBUTTONUP 5 右键释放
    • EVENT_MBUTTONUP 6 中键释放
    • EVENT_LBUTTONDBLCLK 7 左键双击
    • EVENT_RBUTTONDBLCLK 8 右键双击
    • EVENT_MOUSEWHEEL 10 鼠标滚轮上下滚动
    • EVENT_MOUSEHWHEEL 11 鼠标左右滚动
  • 鼠标的组合按键
    • EVENT_FLAG_LBUTTON 1 按下左键
    • EVENT_FLAG_RBUTTON 2 按下右键
    • EVENT_FLAG_MBUTTON 4 按下中键
    • EVENT_FLAG_CTRLKEY 8 按下ctrl键
    • EVENT_FLAG_SHIFTKEY 16 按下shift键
    • EVENT_FLAG_ALTKEY 32 按下alt键

也不是都要记住,在有提示的编辑器中,比如 PyCharm 中就能通过如下方法获取:

在这里插入图片描述
在这里插入图片描述

trackbar

这个组件的意思就是滑动条,这里演示一段 “调色板” 的代码:

from cv2 import cv2
import numpy as np
# 创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar', 640, 480)


# 定义回调函数
def callback(value):
    # print(value)
    pass


# 创建3个trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)
# 创建背景图片
img = np.zeros((480, 640, 3), np.uint8)
while True:
    # 获取当前trackbar的值
    r = cv2.getTrackbarPos('R', 'trackbar')
    g = cv2.getTrackbarPos('G', 'trackbar')
    b = cv2.getTrackbarPos('B', 'trackbar')
    # 用获取到的三个值修改背景图片颜色
    img[:] = [b, g, r]
    cv2.imshow('trackbar', img)
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
cv2.destroyAllWindows()

运行后效果如下:

在这里插入图片描述

当然我还没学到像 tkinter 模块那样能自由调整组件位置,我也不知道他能不能调节位置,但我知道他能调色。
原理就是循环,每次循环都会获得 R、G、B 颜色的值,然后对三维数组的所有最内层数组赋值为 [b, g, r] 要注意这里的顺序不是 R、G、B ,不然你调红就会变蓝,你调蓝就会变红(不要问我为什么这么有经验…)。

双斜率积分ADC:高精度测量中的经典选择与TC530/TC534实战指南 模数转换器(ADC)是连接模拟世界与数字系统的关键桥梁,其核心任务是将连续的模拟信号转换为离散的数字量。在众多ADC类型中,双斜率积分ADC以其独特的原理脱颖而出,它通过积分与反积分的线性过程,用时间换取精度,实现了对噪声的卓越抑制和极高的线性度。这种技术价值使其在对抗工频干扰、追求长期稳定性的场景中无可替代,尤其适用于精密测量仪表和工业传感器信号采集。本文聚焦于双斜率积分ADC的经典代表TC530与TC534,深入剖析其工作原理、关键参数如积分电阻、积分电容的选择,并提供从硬件电路设计到软件驱动的完整实战 阅读详情

相关推荐

SAP Workflow 工作流开发步骤总结

SAP WORKFLOW

qq_36952606的博客 5095

import cv2是什么意思:使用Python的OpenCV库实现图像处理

import cv2 是 Python 中的一个库函数,用于加载和使用 OpenCV 库。OpenCV 是一个开源的计算机视觉库,可以用来进行图像处理、计算机视觉和机器学习等操作。import cv2 是 Python 中的一个库函数,用于加载和使用 OpenCV 库。OpenCV 是一个开源的计算机视觉库,可以用来进行图像处理、计算机视觉和机器学习等操作。

weixin_19970108018的博客 9148

stm32f103c8t6的中文字库

stm32的成熟中文字库,上手即用,操作简单

nbbskk的博客 3654

踩坑指南!import cv2出错怎么办?

好久没有更新,最近代码相关问题看的比较少,有时候忙着debug就忘记了记录,反思一下。 背景:在提取视频帧序列的时候用到了opencv包,结果运行出错。 解决:经过查找资料,import cv2出现“ImportError: numpy.core.multiarray failed to import”最主要的原因是opencv3版本依赖出现问题,太新的numpy版本会导致cv2引用出错,所以出现此类问题,不防降低numpy版本试试! 列几个我用到的语句: pip install opencv-pyt

qq_40706679的博客 2万+

CentOS 7 离线升级 OpenSSH 9.9p2 保姆级教程(含依赖包下载与常见报错解决)

本文提供了一份详尽的CentOS 7系统离线升级OpenSSH至9.9p2版本的完整教程。针对无外网环境,重点讲解了依赖包(尤其是OpenSSL 3.x)的离线下载与编译部署,并深入解决了编译过程中常见的“libcrypto.so缺失”等动态库链接错误。教程涵盖从环境准备、源码编译、服务配置到系统集成的全流程,最后还提供了关键的回滚方案与应急预案,是运维人员在内网环境中进行安全加固的实用指南。

weixin_29248313的博客 325

基于wxWidgets框架,使用DialogBlocks建立OpenGL界面

前言 之前公司要求使用wxWidgets做GUI,基于OpenGL图形内核,开发三维可视化工具。目前初步开发工作基本已经完成,剩下都是完善了。这里记录一下最开始的框架搭建过程(当然是简化版啦)。wxWidgets结合OpenGL开发可以实现跨平台应用,再结合CMake和VS Code,整体开发工具用习惯了会感觉非常顺手。 界面编辑 首先,使用DialogBlocks新建一个工程,这里工程目录...

cyberobot的博客 2751

Pycharm中如何成功import cv2?

在Python中使用cv2(OpenCV库)之前,需要确保已经安装了包。安装完成后,可以在Python脚本中通过简单地导入cv2import cv2这样就可以使用OpenCV提供的各种图像和视频处理功能了。如果还想使用OpenCV的高级功能,比如使用SIFT、SURF等特征检测算法,还需要安装请注意,和包不应该同时安装在同一个环境中,因为opencv-contrib-python。根据需要选择合适的包进行安装。

Joy T的博客 8477

任务混部最少服务器数量计算问题

这里的并行度指的是该任务运行时会占用的服务器数量。要注意的是,一个服务器在每个时刻可以被任意任务使用,但同一时刻最多只能被一个任务占用,并且任务运行结束后会立即释放服务器(结束时刻不占用)。最后,我们从字典中找出服务器数量的最大值,这个最大值就是完成这批任务混部最少需要的服务器数量。对于每个任务,我们会遍历其对应的时间区间,将该任务的并行度累加到对应时刻的服务器数量上。任务混部的目标是让这批任务由同一批服务器承载运行,你需要计算完成这批任务混部最少需要多少服务器,以此来最大化控制资源成本。

m0_62153576的博客 108

【简单粗暴】Python导入cv2包

Python导入cv2包:亲测有用且简单粗暴

信小海 2万+

地下管网巡检机器人:基于YOLOv8与UI界面的智能化系统设计与实现

通过YOLOv8模型的目标检测功能结合实时视频流,我们能够实现对地下管网巡检机器人的智能化控制。系统通过图像识别技术帮助巡检人员快速识别管道中的各种缺陷和障碍物,从而提高巡检效率和准确性。未来,我们可以继续优化模型,增加更多的目标类别,并通过强化学习等方法提高机器人的自主巡检能力。此外,随着硬件技术的发展,未来的巡检机器人可能会具备更强的感知能力和更高的智能水平。

YOLO 533

气象水文资料预处理:缺测数据插补延长等

简介气象水文资料预处理

WW、forever的博客 3773

【OpenCV学习】初识OpenCV

初识OpenCV 安装 OpenCV 启动 Jupyter 创建和销毁窗口 图片在 OpenCV 中的表现

user_from_future的博客 2100

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[Opencv学习]1#初识Opencv

说明:基于《Opencv图像处理入门与实践》的学习内容记录。

larko的博客 1089

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【OpenCV学习笔记01】- 初识OpenCV

个人对于机器学习感兴趣,尤其是图像方面,所以才开始接触并且学习OpenCV。具体的介绍可以自己点击链接去官网的文档看一下。

移动的130 316

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

openCV学习笔记一 —— 初识openCV

OpenCV 是一个广受欢迎的开源计算机视觉库,它提供了很多函数,实现了很多计算机视觉算法,算法从最基本的滤波到高级的物体检测皆有涵盖。

金手指三脚猫 902

Learning OpenCV 第三章:初识OpenCV学习总结

【注】不同的OpenCV版本会有所不同。OpenCV的基本数据类型结构成员意义CvPointint x, y 图像中的点CvPoint2D32ffloat x, y二维空间中的点CvPoint3D32fffloat x, y, z三维空间中的点CvSizeint width, height图像的尺寸CvRectint x, y, width, height图像的部分区域CvScalardouble...

SweetWind1996的博客 545

OpenCV学习(2.1) 初识图像

输出的image0没有打印出来,太长了,不过可以从shape中看到是(861,697,3),代表的是长和宽以及通道数;image1是指定了长的位置,显示的是长为序列【0】时宽以及三个通道上的数值,对应的形状就是(697,3);image2就是选定了长和宽的位置,显示的是在该位置上的三个通道的数值,对应形状就是(3,);灰度化的目的是降低图像的复杂度,减少处理的计算量,同时保留图像的主要特征和结构。举个例子,通常来说的分辨率,1080P,720P,480P就是指像素的数量,数量越多就越清晰。

PLANTTHESON的博客 1183

OpenCV学习笔记-初识轮廓

一、什么是轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。 1、为了更加准确,要使用二值化图像。在寻找轮廓之前,在进行阈值化处理或者canny边界检测。 2、查找轮廓的函数会修改原始图像。如果你在找到轮廓之后还想使用原始图像的话,你应该将原始图像存储到其他变量中。 3、在OpenC...

云中寻雾的博客 807

【图像处理】初识opencv学习笔记

opencv学习笔记

liyiran_的博客 408

opencv 学习: 03 初识 cv:Mat

OpenCV中的cv::Mat数据结构是图像处理的核心,它表示一个像素矩阵,包含了图像的所有信息。Mat对象分为属性部分(如尺寸、通道数)和数据块(像素数据本身)。该数据结构采用引用计数机制管理内存,通过显式调用copyTo()或clone()实现深拷贝,而默认赋值操作仅进行浅拷贝。本文通过代码示例展示了Mat的基本操作:读取图像、灰度转换、数据类型转换、图像创建和拷贝等,重点阐述了Mat的内存管理机制及其对图像处理效率的影响。掌握Mat数据结构特性是进行高效图像处理编程的关键。

每天进步一点点 615

OpenCV SIFT特征学习:(一)初识SIFT

SIFT  (Scale Invariant Feature Transform)         sift,尺度不变特征,通过检测空间域与尺度域上的局部极大值作为特征,常于图像特征匹配,应用领域为目标识别(匹配),图像融合,图像拼接,图像检索等。假设对一幅图像进行sift特征提取,得到N个sift特征点,每个sift特征点的存储结构为128维的向量,则该图像的sift特征描述为N*12

lyt1992的专栏 4243

opencv 学习: 02 初识图片处理

本文介绍了OpenCV图像处理的基本流程和简单操作。主要内容包括: 图片处理三步骤:读取图片(imread)、处理图片(flip等操作)、输出图片(imwrite) 图片显示与窗口事件处理:使用imshow显示图片,并通过setMouseCallback设置鼠标事件回调函数 简单图形绘制:演示了putText、circle、rectangle、line等基本绘图函数的使用 示例代码展示了完整的图片处理流程,包括读取图片、显示窗口、添加鼠标交互、图像翻转处理、结果显示和保存等功能,为OpenCV初学者提供了一

每天进步一点点 177

【图像处理】初识opencv学习笔记 2

opencv学习笔记2

liyiran_的博客 281

opencv学习笔记(二):初识HighGUI

图像的输入输出,显示,鼠标操作,滚动条操作

youknow_zh的博客 238

【opencv_python学习之二】图像处理初识

0、背景介绍 在本篇文章中所有示例所处理的图片为下图0.1,图片名字为a.png。 图 0.1 下图0.2, 图片名字为b.png 图 0.2 下图0.3, 图片名字为c.png 图 0.3 1、获取并修改某点RGB值 1.1、获取某点RGB值 1.1.1、代码示例 代码: 1.1.py import cv2 import numpy as np # 读取图片a.png img = c...

weixin_34315485的博客 228

OpenCV人工智能图像处理学习笔记2 opencv初识图片保存像素理解

图形的分类与识别 http://www.image-net.org/ 导入模块要点击运行,不然点击table键就没有提示。 import tensorflow as tf hello = tf.constant("hello tf") sess = tf.Session() print(sess.run(hello)) tensorflow模块运行,安装正确。 Op...

moonlightpeng的博客 641
上一篇: 【网页制作】原生JavaScript制作“井字棋”
下一篇: 【OpenCV学习】OpenCV的色彩空间
user_from_future
博客等级 码龄5年 4067粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值