Jetson Nano使用CSI摄像头教程(python)
程序员文章站
2023-03-25 08:42:02
Jetson Nano使用CSI摄像头教程(python))一、基于Opencv的人脸检测二、读取CSI摄像头三、二维码检测和识读一、基于Opencv的人脸检测首先编写一个python脚本用于检测图像中的人脸,使用Code OSS打开2.4.4节中创建的code文件夹,在该文件夹下新建一个python脚本,名为face_detect_test.py,代码如下所示:import cv2 filepath = "/home/hf1/Python_code/test.jpeg" #用绝对路径img =...
Jetson Nano使用CSI摄像头教程(python))
一、基于Opencv的人脸检测
首先编写一个python脚本用于检测图像中的人脸,使用Code OSS打开2.4.4节中创建的code文件夹,在该文件夹下新建一个python脚本,名为face_detect_test.py,代码如下所示:
import cv2
filepath = "/home/hf1/Python_code/test.jpeg" #用绝对路径
img = cv2.imread(filepath) # 读取图片
print(type(img))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换灰色
print(type(gray))
# OpenCV人脸识别分类器
classifier = cv2.CascadeClassifier( "/home/hf1/Python_code/haarcascade_frontalface_default.xml" )#用绝对路径
color = (0, 255, 0) # 定义绘制颜色
# 调用识别人脸
faceRects = classifier.detectMultiScale( gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects): # 大于0则检测到人脸
for faceRect in faceRects: # 单独框出每一张人脸
x, y, w, h = faceRect
# 框出人脸
cv2.rectangle(img, (x, y), (x + h, y + w), color, 2)
cv2.imshow("image", img) # 显示图像
c = cv2.waitKey(10)
cv2.waitKey(0)
cv2.destroyAllWindows()
在构造opencv人脸检测分类器时,需要对应的人脸检测配置文件,该文件存储了用于人脸检测算法的相关参数,此文件可以从opencv的安装目录找到:/usr/share/opencv4/。找到后将其拷贝到python源文件目录下即可。
代码运行效果如下图所示
二、读取CSI摄像头
使用Gstreamer读取CSI摄像头主要分为3个步骤:创建Gstreamer管道;将管道绑定opencv的视频流;逐帧提取和显示。Python代码如下所示:
```import cv2
#设置gstreamer管道参数
def gstreamer_pipeline(
capture_width=1280, #摄像头预捕获的图像宽度
capture_height=720, #摄像头预捕获的图像高度
display_width=1280, #窗口显示的图像宽度
display_height=720, #窗口显示的图像高度
framerate=60, #捕获帧率
flip_method=0, #是否旋转图像
):
return (
"nvarguscamerasrc ! "
"video/x-raw(memory:NVMM), "
"width=(int)%d, height=(int)%d, "
"format=(string)NV12, framerate=(fraction)%d/1 ! "
"nvvidconv flip-method=%d ! "
"video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx ! "
"videoconvert ! "
"video/x-raw, format=(string)BGR ! appsink"
% (
capture_width,
capture_height,
framerate,
flip_method,
display_width,
display_height,
)
)
if __name__ == "__main__":
capture_width = 1280
capture_height = 720
display_width = 1280
display_height = 720
framerate = 60
flip_method = 0
# 创建管道
print(gstreamer_pipeline(capture_width,capture_height,display_width,display_height,framerate,flip_method))
#管道与视频流绑定
cap = cv2.VideoCapture(gstreamer_pipeline(flip_method=0), cv2.CAP_GSTREAMER)
if cap.isOpened():
window_handle = cv2.namedWindow("CSI Camera", cv2.WINDOW_AUTOSIZE)
# 逐帧显示
while cv2.getWindowProperty("CSI Camera", 0) >= 0:
ret_val, img = cap.read()
# 图像太大需要调整
height, width = img.shape[0:2]
print("height=",height,"width=",width)
if width > 800:
new_width = 640
new_height = int(new_width/width*height)
img = cv2.resize(img, (new_width, new_height))
print("new_height=",new_height,"new_width=",new_width)
cv2.imshow("CSI Camera", img)
#print("img.shape=",img.shape)
keyCode = cv2.waitKey(30) & 0xFF
if keyCode == 27:# ESC键退出
break
#print("img.shape=",img.shape)
#释放资源
cap.release()
cv2.destroyAllWindows()
else:
print("打开摄像头失败")
代码运行效果如下图所示
三、二维码检测和识读
使用Opencv实现二维码检测和识读功能。在opencv4.0以后,已经集成了二维码识读模块,因此,可以采用最新的opencv来实现二维码检测和识读。二维码检测和识别主要分为3步:使用QRCodeDetector()函数创建二维码检测器;使用detectAndDecode函数对图像进行二维码检测和识别;将检测结果输出。要是读取视频流的每帧图像然后对图像进行检测,Python版二维码检测和识读代码如下所示
import cv2
# 设置gstreamer管道参数
def gstreamer_pipeline(
capture_width=1280, #摄像头预捕获的图像宽度
capture_height=720, #摄像头预捕获的图像高度
display_width=1280, #窗口显示的图像宽度
display_height=720, #窗口显示的图像高度
framerate=60, #捕获帧率
flip_method=0, #是否旋转图像
):
return (
"nvarguscamerasrc ! "
"video/x-raw(memory:NVMM), "
"width=(int)%d, height=(int)%d, "
"format=(string)NV12, framerate=(fraction)%d/1 ! "
"nvvidconv flip-method=%d ! "
"video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx ! "
"videoconvert ! "
"video/x-raw, format=(string)BGR ! appsink"
% (
capture_width,
capture_height,
framerate,
flip_method,
display_width,
display_height,
)
)
if __name__ == "__main__":
capture_width = 1280
capture_height = 720
display_width = 1280
display_height = 720
framerate = 60
flip_method = 0
# 创建管道
print(gstreamer_pipeline(capture_width,capture_height,display_width,display_height,framerate,flip_method))
#管道与视频流绑定
cap = cv2.VideoCapture(gstreamer_pipeline(flip_method=0), cv2.CAP_GSTREAMER)
#创建二维码检测器
qrDecoder = cv2.QRCodeDetector()
if cap.isOpened():
window_handle = cv2.namedWindow("CSI Camera", cv2.WINDOW_AUTOSIZE)
# 逐帧显示
while cv2.getWindowProperty("CSI Camera", 0) >= 0:
ret_val, img = cap.read()
# 图像太大需要调整
height, width = img.shape[0:2]
print("height=",height,"width=",width)
if width > 800:
new_width = 640
new_height = int(new_width/width*height)
img = cv2.resize(img, (new_width, new_height))
print("new_height=",new_height,"new_width=",new_width)
# 二维码检测和识别
data, bbox, rectifiedImage = qrDecoder.detectAndDecode(img)
if len(data) > 0:
print("解码数据 : {}".format(data))
n = len(bbox)
for j in range(n):
cv2.line(img, tuple(bbox[j][0]), tuple(
bbox[(j+1) % n][0]), (255, 0, 0), 3)
else:
print("没有检测到二维码")
cv2.imshow("CSI Camera", img)
#print("img.shape=",img.shape)
keyCode = cv2.waitKey(30) & 0xFF
if keyCode == 27:# ESC键退出
break
#print("img.shape=",img.shape)
#释放资源
cap.release()
cv2.destroyAllWindows()
else:
print("打开摄像头失败")
代码运行效果如下图所示
本文地址:https://blog.csdn.net/chutu2018/article/details/109920996
上一篇: 电脑显示器屏幕字体模糊原因分析及解决方法
下一篇: 富顺豆花蘸水是什么?应该是可以吃的吧?