ML Journal6—OpenCV中的GUI功能

news2024/12/23 18:37:46

图像入门

这是将在本教程中使用的图像

620d8432cd33139677fc2e15241c2825.jpeg

borz.jpg

import cv2 as cv
import sys

img = cv.imread('borz.jpg')
if img is None:
    sys.exit("Could not read the file.")
cv.imshow("Display Window", img)
k = cv.waitKey(0)
if k == ord("s"):
    cv.imwrite("Khamzat Chimaev.jpg", img)

此代码显示图像 borz.jpg

我们逐行看一下代码

import cv2 as cv
import sys

我们导入必要的库

img = cv.imread('borz.jpg')

读取图像文件'borz.jpg'

if img is None:
  sys.exit("Could not read the file.")

如果由于某种原因无法读取文件,请退出。

cv.imshow("Display Window", img)

显示图像。“Display Window”将是窗口的标题。

k = cv.waitKey(0)

由于我们想在按键时关闭窗口,所以 cv.waitKey(0) 将等待我们的按键输入。参数是毫秒。

例如 cv.waitKey(10000) 将等待用户输入 10 秒并自动关闭窗口。0 表示永远等待。

if k == ord("s"):
  cv.imwrite("Khamzat Chimaev.jpg", img)

如果键输入是“s”,我们会将图像保存为“Khamzat chimaev.jpg”。

14d4bb645802b27449d4737a7364ccbb.png

视频入门

现在让我们转到视频。

import numpy as np
import cv2 as cv

cap = cv.VideoCapture(0)
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    # Capture frame-by-frame
    ret, frame = cap.read()
    # if frame is read correctly ret is True
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    # Our operations on the frame come here
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv.imshow('frame', gray)
    if cv.waitKey(1) == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()

此代码将打开相机的网络摄像头并将其显示为黑白视频。

让我们分解这段代码。

cap = cv.VideoCapture(0)

捕获摄像机。参数是视频设备的索引。

if not cap.isOpened():
  print("Cannot open camera")
  exit()

如果捕获失败,则退出。

while True:
  # Capture frame-by-frame
  ret, frame = cap.read()

逐帧捕捉

# if frame is read correctly ret is True
if not ret:
  print("Can't receive frame (stream end?). Exiting ...")
  break

如果没有正确读取帧,则中断循环。

gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

将颜色设置为灰度。

cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'):
  break

显示视频,直到用户按下“q”。如果 cv.waitKey() 的参数未设置为 1,假设为 0,则帧将冻结并无限期地等待用户输入。

# When everything done, release the capture
cap.release()
cv.destroyAllWindows()

cap.release() 释放硬件和软件资源。

决定不上传我们的网络摄像头结果。

现在让我们将网络摄像头输出保存到一个文件中。环境是macbook。如果尝试官方的 opencv 教程,文件已创建但长度为 00:00 并且为空。通过艰苦的检查错误,发现应该将输出视频的大小设置为输入视频的大小。

frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
size = (frame_width, frame_height)

如果没有此参数,文件将不记录任何内容。

import cv2

# Create an object to read
# from camera
video = cv2.VideoCapture(0)

# We need to check if camera
# is opened previously or not
if (video.isOpened() == False):
 print("Error reading video file")

# We need to set resolutions.
# so, convert them from float to integer.
frame_width = int(video.get(3))
frame_height = int(video.get(4))

size = (frame_width, frame_height)
print(size)

# Below VideoWriter object will create
# a frame of above defined The output
# is stored in 'filename.avi' file.
result = cv2.VideoWriter('filename.avi',
      cv2.VideoWriter_fourcc(*'MJPG'),
      20, size)
 
while(True):
 ret, frame = video.read()

 if ret == True:

  # Write the frame into the
  # file 'filename.avi'
  result.write(frame)

  # Display the frame
  # saved in the file
  cv2.imshow('Frame', frame)

  # Press S on keyboard
  # to stop the process
  if cv2.waitKey(1) & 0xFF == ord('s'):
   break

 # Break the loop
 else:
  break

# When everything done, release
# the video capture and video
# write objects
video.release()
result.release()
 
# Closes all the frames
cv2.destroyAllWindows()

print("The video was successfully saved")

这是工作代码。

播放视频文件的工作方式与打开图像文件非常相似。

OpenCV 中的绘图函数

import numpy as np
import cv2 as cv

# Create a black image
img = np.zeros((512,512,3), np.uint8)

# Draw a diagonal blue line with thickness of 5 px
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.imshow("Display Window", img)
cv.waitKey(0)

输出图像

3c8072871dcd2a279b47a23fd392b031.png
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)

你可以添加一个矩形

c51a458f4b9755c81e24c2a4ad397104.png
cv.circle(img,(447,63), 63, (0,0,255), -1)

一个圆圈

cc79310fc4e017fbdac39bbb08c288a7.png
cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)

一个椭圆

ff7d83770a949b0d1d1d8597ed66811d.png
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))

一个多边形

e4be3bc84f375aaa19544cb0526592fc.png
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)

你甚至可以在图像中添加文本。

be3f2002742bd5f7aef81110e5f02846.png

练习

  1. 尝试使用 OpenCV 中可用的绘图功能创建 OpenCV 的徽标。

我们的目标

b1024f35a0ec649d7959543bf00a1139.jpeg
img = np.full((512,512,3), 255, np.uint8)

这将使 img 成为白色 512 x 512 图像

cv.ellipse(img,(256,256),(50,50),60,60,360,(0,0,255),-1)

这将在 (256,256) 处绘制一个椭圆。它的半径将是 (50,50)。它将在 60 度(顺时针)停止绘制 60 度。

它显示所有椭圆(360)。它是红色的 (0,0,255)。它将被填充(-1)

469d7c386428906efba4ce33f3c939d5.png

我们可以调整角度和位置,并添加蓝色和绿色椭圆的代码。并添加文字。

cv.ellipse(img,(256,200),(50,50),60,60,360,(0,0,255),-1)
cv.ellipse(img,(200,300),(50,50),300,60,360,(0,255,0),-1)
cv.ellipse(img,(256+56,300),(50,50),240,60,360,(255,0,0),-1)

font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(0,0,0),2,cv.LINE_AA)

最终结果

9ebecdb19074a0dde2755f4ff46ab2df.png

完整代码

import numpy as np
import cv2 as cv

# Create a white image
img = np.full((512,512,3), 255, np.uint8)
cv.ellipse(img,(256,200),(50,50),60,60,360,(0,0,255),-1)
cv.ellipse(img,(200,300),(50,50),300,60,360,(0,255,0),-1)
cv.ellipse(img,(256+56,300),(50,50),240,60,360,(255,0,0),-1)
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(0,0,0),2,cv.LINE_AA)
cv.imshow("Display Window", img)
cv.waitKey(0)

鼠标作为画笔

opencv 官方教程几乎没有用。这是弄清楚的代码。

import numpy as np
import cv2 as cv

img = np.zeros((512,512,3), np.uint8)

def draw_circle(event, x, y, flags, param):
    if event == cv.EVENT_LBUTTONDOWN:
        cv.circle(img,(x,y),40,(255,255,255),-1)

cv.namedWindow('image')
while True:
    cv.setMouseCallback('image',draw_circle)
    cv.imshow('image', img)
    k = cv.waitKey(1)
    if k == 27: # if input is esc key
        break

无论何时何地点击它都会画一个圆圈。

Trackbar 作为调色板

出于某种原因,当尝试移动 Trackbar 时,它会崩溃并显示以下消息:zsh: segmentation fault.

opencv和macOS的版本似乎有问题。

而我们对此无能为力。

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

a53cd5c56aed9a7260268173f56691bd.jpeg

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

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

相关文章

《自己动手写CPU》学习记录(5)——第5章/Part 1

目录 引言 致谢 流水线的数据相关问题 问题分析 RAW类型 1、相邻指令数据相关 2、间隔1条指令数据相关 3、间隔2条指令数据相关 修改后的代码 译码模块 指令执行模块 顶层模块 测试 测试代码 生成.data初始化文件 仿真结果 引言 随章节进度继续推进&#xff0c…

【视频】马尔可夫链原理可视化解释与R语言区制转换MRS实例|数据分享

原文链接:http://tecdat.cn/?p12280马尔可夫链是从一个“状态”(一种情况或一组值)跳到另一个“状态”的数学系统。本文介绍了马尔可夫链和一种简单的状态转移模型,该模型构成了隐马尔可夫模型(HMM)的特例…

近期方案研究总结(那些你用的到的排列组合)

方案一 这个方案只一个位置一个号码,标的物即一个位置八十期不重即可以切入,以这样的思路去进行扩充。 纬度一 两期重复形态为:11、22、33、44、55、66、77、88、99、1010。 数上升一形态为:12、23、34、45、56、67、78、89、910…

微服务框架 SpringCloud微服务架构 28 数据同步 28.6 测试同步功能

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构28 数据同步28.6 测试同步功能28.6.1 直接开干28 数据同步 28.6 测试同步…

云安全系列5:2023 年需要了解的 40个云安全术语

云安全具有广泛而复杂的特点,它有许多特定的术语和首字母缩略词。我们在这里整理了一些云安全术语。将其用作指南,可帮助您了解云安全的细微差别并更便于学习相关内容。 Agent 代理是专门的软件包或应用程序,部署到设备或机器上以完成与安全…

IDEA:Idea 集成 EasyYApi 插件实现接口文档的生成与更新

我是 ABin-阿斌:写一生代码,创一世佳话,筑一览芳华。如果小伙伴们觉得不错就一键三连吧~ 声明:文章原文来源处: https://blog.csdn.net/weixin_40863968/article/details/122432678https://www.jianshu.com/p/cd91590…

10个知识点让你读懂Spring MVC容器

DispatcherServlet 的配置参数 可以通过的属性指定配置参数: namespace参数:DispatcherServlet对应的命名空间,默认是WEB-INF/-servlet.xml。在显式配置该参数后,新的配置文件对应的路径是WEB-INF/.xml,例如如果将name…

Android 移植iperf3.13 测试网络

iperf,测试网络性能的,不同于 webrtc里面的gcc 算法预估网络带宽,iperf是实际占用网络来传输数据测量实际的网络性能。 官网:https://iperf.fr/ 官方就有 android 的下载 https://iperf.fr/iperf-download.php#android, 但是看起…

绕线机算法模型(Simulink仿真验证+PLC代码实现)

绕线机应用的详细内容大家可以参看下面这篇博客,这里不再赘述。本文主要借助Simulink仿真分析和解决工程实际问题。希望对大家学习Simulink有所帮助。限于水平和能力所限,文中难免出现错误和不足之处,诚恳的希望大家批评和指正。 S7-200 SMART PLC和V20变频器绕线机控制应用…

Linux(在 Linux 上搭建 java 部署环境(安装jdk/tomcat/mysql) + 将程序部署到云服务器上的操作)

目录 🐲 1. 在 Linux 上搭建 java 部署环境 🦄 1.1 安装 jdk 🦄 1.2 安装 tomcat 🦄 1.3 安装 mysql 🐲 2. 将[博客系统]部署到云服务器上 🦄 2.1 先在云服务器上,创建和之前 windows 上一样的数据库…

德勤、阿里为数据智能时代造势,是风口还是韭菜?

前不久,德勤和阿里高调发布了业内首个DAAS报告《DAAS数字化新世代的最优解》,强调“企业不应该继续将数据智能建设当作‘选择题’,而是一道‘必答题’!” 德勤管理咨询中国首席执行官戴耀华(右)与阿里巴巴集…

自学编程技术如何选择书籍?

首先自学编程的话,也是要先确定要选择适合自己的编程语言。然后再购买相应的编程教材,不知道怎么选择的话,可以直接选择黑马的原创书籍。 《C语言开发基础》 内容简介 本书是对《C语言开发入门教程》一书的全新改版,本次改版结合…

智能驾驶穿越“寒冬”:Argo AI们倒下,复睿智行们崛起

作者 | 曾响铃 文 | 响铃说(xiangling0815) 寒气还在智能驾驶领域蔓延。 在过去的一段时间,裁员、倒闭、破产、市值下跌、巨头撤离等等一系列不好的消息在智能驾驶行业频频爆出,一批老牌的智能驾驶企业更是倒在了黎明前。 智能…

OpenCV实战——实现高效图像扫描循环

OpenCV实战——实现高效图像扫描循环0. 前言1. 测量代码运行时间2. 计算不同扫描算法的执行时间4. 完整代码及运行结果相关链接0. 前言 在《像素操作》一节中,我们介绍了扫描图像以处理其像素的不同方法。在本节中,我们将学习比较这些方法的计算效率。编…

Linux篇 一、香橙派Zero2设置开机连接wifi

香橙派Zero2系列文章目录 一、香橙派Zero2设置开机连接wifi 文章目录香橙派Zero2系列文章目录前言一、调试串口的连接说明二、WIFI 连接测试1.首先使用 nmcli dev wifi 命令扫描周围的 WIFI 热点2.找到自己的wifi,准备好wifi名称和密码三、设置开机连接WiFi总结前言…

【MySQL】第10章_创建和管理表

创建和管理表1. 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型2. 创建和管理数据库2.1 创建数据库2.2 使用数据库查看当前所有的数据库查看当前正在使用的数据库查看指定库下所有的表查看数据库的创建信息使用/切换数据库2.3 修改数据库更改数据库字…

RadZen 最新注册版,2022年末圣诞-happy

RadZen快速简单地生成业务 Web 应用程序,以可视化方式构建和启动 Web 程序,而我们会为您创建新代码。 从信息开始 连接到数据库。Radzen 推断您的信息并生成功能完备的 Web 应用程序。支持 MSSQL REST 服务。 微调添加页面或编辑生成的页面。通过预览您…

vue使用高德地图,marker低于1000,滑动卡顿问题的探究(已解决)

问题描述 vue使用高德地图点标记,刚开始使用的是Marker,但是数目超过300,滑动就卡顿,按文档来说,Marker 类型推荐在数据量为 500 以内时使用,不应该卡顿。后边就开始对这个bug进行两天脑秃的探究了 1.换成…

pytorch-天气识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章地址: 365天深度学习训练营-第P3周:天气识别🍖 作者:K同学啊一、前期准备 1.设置GPU import torch import torch.nn as nn impor…

MAC苹果系统安装数字证书的方法

MAC苹果系统安装数字证书的方法之工具/原料 Mac OS电脑一台 数字证书 先讲讲安装方法,mac系统默认浏览器是Safari,那小D在这里就以Safari浏览器为例子,讲解一下相关的安装方法 如果已有开通了数字证书的用户,在重装了系统或是在没有安装安装证书的电脑上进行付款时,会提…