ML Journal6—OpenCV中的GUI功能

图像入门

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

ML Journal6—OpenCV中的GUI功能_第1张图片

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”。

ML Journal6—OpenCV中的GUI功能_第2张图片

视频入门

现在让我们转到视频。

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)

输出图像

ML Journal6—OpenCV中的GUI功能_第3张图片
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)

你可以添加一个矩形

ML Journal6—OpenCV中的GUI功能_第4张图片
cv.circle(img,(447,63), 63, (0,0,255), -1)

一个圆圈

ML Journal6—OpenCV中的GUI功能_第5张图片
cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)

一个椭圆

ML Journal6—OpenCV中的GUI功能_第6张图片
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))

一个多边形

ML Journal6—OpenCV中的GUI功能_第7张图片
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)

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

ML Journal6—OpenCV中的GUI功能_第8张图片

练习

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

我们的目标

ML Journal6—OpenCV中的GUI功能_第9张图片
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)

ML Journal6—OpenCV中的GUI功能_第10张图片

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

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)

最终结果

ML Journal6—OpenCV中的GUI功能_第11张图片

完整代码

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」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

ML Journal6—OpenCV中的GUI功能_第12张图片

你可能感兴趣的:(opencv,计算机视觉,人工智能,图像处理)