欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Jetson Nano使用CSI摄像头教程(python)

程序员文章站 2022-05-09 18:02:11
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 =...

一、基于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源文件目录下即可。
代码运行效果如下图所示
Jetson Nano使用CSI摄像头教程(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("打开摄像头失败")

代码运行效果如下图所示
Jetson Nano使用CSI摄像头教程(python)

三、二维码检测和识读

使用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