ML Journal6—OpenCV中的GUI功能
创始人
2024-03-28 10:02:09
0

图像入门

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

620d8432cd33139677fc2e15241c2825.jpeg

borz.jpg

import cv2 as cv
import sysimg = 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 cvcap = cv.VideoCapture(0)
if not cap.isOpened():print("Cannot open camera")exit()
while True:# Capture frame-by-frameret, frame = cap.read()# if frame is read correctly ret is Trueif not ret:print("Can't receive frame (stream end?). Exiting ...")break# Our operations on the frame come heregray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# Display the resulting framecv.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-frameret, 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 filecv2.imshow('Frame', frame)# Press S on keyboard# to stop the processif cv2.waitKey(1) & 0xFF == ord('s'):break# Break the loopelse: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 cvimg = 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 keybreak

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

Trackbar 作为调色板

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

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

而我们对此无能为力。

☆ END ☆

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

扫描二维码添加小编↓

a53cd5c56aed9a7260268173f56691bd.jpeg

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...