这篇文章中,我们主要完成以下几项任务:
一、我们讲解一下利用OpenCV自带的功能来调用手机摄像头实时拍照、实时逐帧捕捉手机摄像头所拍摄的画面(我们直接讲一个稍微有一点难度的代码,即Canny边缘检测,同理,霍夫直线检测也是相同的道理,我们在这里就不过多啰嗦了)
二、将写好的代码文件通过Aidlux自带的传输文件的端口,从本地上传到手机/home文件目录下
三、在软件自带的终端上运行我们写好的python文件
四、最后,我们利用Aidlux自带的launch-build应用,将我们写好的python代码成功创建成桌面应用,并从桌面运行启动,至此,我们今天的任务就告成了!!!
正文
一、讲解代码:
import cv2
import numpy as np
from cvs import *
import matplotlib.pyplot as plt
import time
import matplotlib
## 初始化摄像头
# 摄像头ID 0-后置 1-前置
Camera_ID = 0
# 获取摄像头信息
cap = cvs.VideoCapture (Camera_ID)
## 逐帧处理函数(选择一个运行)
# 逐帧处理函数,默认不进行任何处理,直接将摄像头捕获的画面写入视频帧
# 一、什么都不改动,直接获取手机摄像头画面进行展示
# def process_frame(img_bgr):
# '''输入BGR格式的 numpy array,输出BGR格式的 numpy array'''
# # img_bgr = img_bgr[:,:,::-1] # BGR转RGB
# return img_bgr
# 二、 Canny 边缘检测
# def process_frame(img_bgr):
# '''输入BGR格式的 numpy array,输出BGR格式的 numpy array'''
# img_bgr = cv2.Canny(img_bgr, 100, 200)
# img_bgr = np.dstack((img_bgr, img_bgr, img_bgr))
# return img_bgr
# 三、 Canny 边缘检测 - 写 FPS 数值
# def process_frame(img_bgr):
# '''输入BGR格式的 numpy array,输出BGR格式的 numpy array'''
# # 记录该帧开始处理的时间
# start_time = time.time()
# # 逐帧处理操作
# img_bgr = cv2.Canny(img_bgr, 100, 200)
# img_bgr = np.dstack((img_bgr, img_bgr, img_bgr))
# # 记录该帧处理完毕的时间
# end_time = time.time()
# # 计算每秒处理图像帧数FPS
# FPS = 1/(end_time - start_time)
# # 在画面上写 FPS 数值
# end_time = time.time()
# FPS = 1/(end_time - start_time) # 计算每秒处理图像帧数FPS
# FPS_string = 'FPS {:.2f}'.format(FPS) # 写在画面上的字符串
# img_bgr = cv2.putText(img_bgr, FPS_string, (25, 100), cv2.FONT_HERSHEY_SIMPLEX, 1.25, (255, 0, 255), 2) # 在画面上写字:图片,字符串,左上角坐标,字体,字体大小,颜色,字体粗细
# return img_bgr
# 四、Hough 直线检测 - 写 FPS 数值
def process_frame(img_bgr):
# 记录该帧开始处理的时间
start_time = time.time ()
img_gray = cv2.cvtColor (img_bgr, cv2.COLOR_BGR2GRAY) # BGR 转 灰度图
edges = cv2.Canny (img_gray, 50, 150, apertureSize=3) # Canny 直线检测
lines = cv2.HoughLines (edges, 1, np.pi / 180, 150) # 霍夫直线检测
if lines is None: # 如果检测出直线
pass
else:
for line in lines:
rho, theta = line[0]
a = np.cos (theta)
b = np.sin (theta)
x0 = a * rho
y0 = b * rho
# x1 stores the rounded off value of (r * cos(theta) - 1000 * sin(theta))
x1 = int (x0 + 1000 * (-b))
# y1 stores the rounded off value of (r * sin(theta)+ 1000 * cos(theta))
y1 = int (y0 + 1000 * (a))
# x2 stores the rounded off value of (r * cos(theta)+ 1000 * sin(theta))
x2 = int (x0 - 1000 * (-b))
# y2 stores the rounded off value of (r * sin(theta)- 1000 * cos(theta))
y2 = int (y0 - 1000 * (a))
img_bgr = cv2.line (img_bgr, (x1, y1), (x2, y2), (0, 0, 255), 2)
# 在画面上写 FPS 数值
end_time = time.time ()
FPS = 1 / (end_time - start_time) # 计算每秒处理图像帧数FPS
FPS_string = 'FPS {:.2f}'.format (FPS) # 写在画面上的字符串
img_bgr = cv2.putText (img_bgr, FPS_string, (25, 100), cv2.FONT_HERSHEY_SIMPLEX, 1.25, (255, 0, 255),
2) # 在画面上写字:图片,字符串,左上角坐标,字体,字体大小,颜色,字体粗细
return img_bgr
## 逐帧实时处理手机摄像头拍摄的画面-代码模板
while True:
img_bgr = cap.read ()
if img_bgr is None:
continue
img_bgr = process_frame (img_bgr)
cvs.imshow (img_bgr)
相信一定有很多UU们对这句话感到很疑惑:from cvs import * ,在这里我们统一说明一下,cvs是Aidlux自带的OpenCV视觉处理库,和传统的跑python的OpenCV库相同道理,只是换了一个名字而已,具体用法和传统的OpenCV用法相同,这个需要我们注意一下!!!
二、将本地写好的python文件上传至手机/home目录下
将登录网址的端口从8000换成38080就能进入到我们文件传输的页面
实例:我本机远程连接手机的网址为:AidLux OS
但如果我换成38080端口就进入到了文件传输界面:
紧接着,我们将本地编写的 逐帧拍摄和OpenCV结合.py (大佬们不要喷我,刚接触计算机视觉,易于自己区分,不得不将文件名字改成中文便于自己区分 -_- -_- -_-)
三、在终端上运行我们写好的python文件
启动命令为:python 逐帧拍摄和OpenCV结合.py
这个是手机上显示的画面:
四、利用Aidlux自带的launch-build应用,将我们写好的python代码成功创建成桌面应用
打开launch-build应用显示如下,我这里将其应用名称设置为 远方上 ,图标自选,唯一标识设置为:yuanfangshang(这个也可以自己随便写,只要不和其他应用有冲突就行)启动命令为:python /home/逐帧拍摄和OpenCV结合.py 这样的绝对路径, 访问路径可以随便填,如:http://0.0.0.0:40478 点击提交就能在桌面上看到我们刚设置好的软件应用了,我们的任务也打工告成了!!!
相关运行视频如下:
调用手机摄像头实时显示画面