Jetson nano 入手系列之6—使用qt creator 开发c++ opencv+CSI摄像头人脸检测

Jetson nano 入手系列之6—使用qt creator 开发c++ opencv+CSI摄像头人脸检测

  • 1.创建摄像头人脸检测项目
    • 1.1 创建并配置项目
    • 1.2 编辑文件
      • 1.2.1 main.cpp
      • 1.2.2 CMakeLists.txt
  • 2.构建及编译
    • 2.1 直接使用qt creator完成
    • 2.2 使用命令行
  • 参考文献

本系列针对亚博科技jetson nano开发板。

Jetson nano 入手系列:
Jetson nano 入手系列之1—如何SSH远程登录
Jetson nano 入手系列之2—板载摄像头IMX219启动
Jetson nano 入手系列之3—修改主机名和用户名
Jetson nano 入手系列之4—外围设备:开机键+PWM风扇
Jetson nano 入手系列之5—远程可视化访问:jupyter lab与VNC连接
Jetson nano 入手系列之6—使用qt creator 开发c++ opencv+CSI摄像头人脸检测

使用本博客开发时,默认qt creator 已经安装完成,csi摄像头安装并测试成功(此部分可参考Jetson nano 入手系列之2—板载摄像头IMX219启动)。

本文参考了csdn 博客Jetson Nano 从入门到实战(案例:Opencv配置、人脸检测、二维码检测),相比此文,主要有几点不同:

● 实现了从CSI摄像头视频数据读取到人脸检测完整的代码;
● 使用qt creator c++开发,模板采用了Non-Qt Project中的Plain C++ Application;
● 使用CMake进行构建和编译。

1.创建摄像头人脸检测项目

1.1 创建并配置项目

  • 新建项目
    Jetson nano 入手系列之6—使用qt creator 开发c++ opencv+CSI摄像头人脸检测_第1张图片

  • 输入项目名称和位置;
    Jetson nano 入手系列之6—使用qt creator 开发c++ opencv+CSI摄像头人脸检测_第2张图片

  • build system选择CMake;
    Jetson nano 入手系列之6—使用qt creator 开发c++ opencv+CSI摄像头人脸检测_第3张图片

  • 配置好的初始化项目由一个cpp文件及CMake文件组成;
    Jetson nano 入手系列之6—使用qt creator 开发c++ opencv+CSI摄像头人脸检测_第4张图片

1.2 编辑文件

1.2.1 main.cpp

打开文件可以看到,初始化文件给出了一个hello worlddemo

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;

string gstreamer_pipeline (int capture_width, int capture_height, int display_width, int display_height, int framerate, int flip_method)
{
    return "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=(int)" + to_string(capture_width) + ", height=(int)" +
           to_string(capture_height) + ", format=(string)NV12, framerate=(fraction)" + to_string(framerate) +
           "/1 ! nvvidconv flip-method=" + to_string(flip_method) + " ! video/x-raw, width=(int)" + to_string(display_width) + ", height=(int)" +
           to_string(display_height) + ", format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink";
}

void face_detector(Mat img, vector<Rect> *faceRects)
{
    Mat gray;
    cvtColor(img, gray, CV_BGR2GRAY);
    CascadeClassifier classifier;
    classifier.load("/usr/share/opencv4/haarcascades/haarcascade_frontalface_default.xml");
    classifier.detectMultiScale(gray, *faceRects, 1.1, 3, 0, Size(32, 32));
}

void Rect_show(Mat img,const vector<Rect> &faceRects)
{
    Scalar color = Scalar(0, 255, 255);
    for (size_t i = 0; i < faceRects.size(); i++)
    {
        rectangle(img, faceRects[i], color);
    }
    namedWindow("Display window", WINDOW_AUTOSIZE);
    imshow("Display window", img);
}

int main( int argc, char** argv )
{
    int capture_width = 640 ;
    int capture_height = 480 ;
    int display_width = 320 ;
    int display_height = 240 ;
    int framerate = 10 ;
    int flip_method = 0 ;

    string pipeline = gstreamer_pipeline(capture_width,
    capture_height,
    display_width,
    display_height,
    framerate,
    flip_method);
    std::cout << "gstreamer channel: \n\t" << pipeline << "\n";

    VideoCapture cap(pipeline, CAP_GSTREAMER);
    if(!cap.isOpened())
    {
        std::cout<<"capture failed "<<std::endl;
        return (-1);
    }

    Mat img;

    while(true)
    {
        if (!cap.read(img))
        {
            std::cout<<"Open camera failed!"<<std::endl;
            break;
        }
        
        vector<Rect> faceRects;
        face_detector(img,&faceRects);
        cout << faceRects.size() <<" faces detected!"<< endl;
        
        Rect_show(img,faceRects);
        
        int keycode = cv::waitKey(30) & 0xff ;//ESC键退出
            if (keycode == 27) break ;
    }

    cap.release();
    destroyAllWindows() ;
    return 0;
}

它主要包含了设置摄像头视频读取参数的子函数gstreamer_pipelineopencv检测人脸子函数face_detector以及在原图显示矩形框的Rect_show子函数组成。

face_detectorRect_show子函数中分别使用了指针以及引用方式来作为函数参数。

1.2.2 CMakeLists.txt

CMake文件中主要是包含了opencv用到的一些库:

cmake_minimum_required(VERSION 2.8)

project(face_detector_cam)
FIND_PACKAGE(OpenCV REQUIRED)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
LINK_LIBRARIES(${OpenCV_LIBS})
MESSAGE(STATUS "OpenCV_INCLUDE_DIRS:"${OpenCV_INCLUDE_DIRS})

add_executable(${PROJECT_NAME} "main.cpp")

2.构建及编译

2.1 直接使用qt creator完成

Jetson nano 入手系列之6—使用qt creator 开发c++ opencv+CSI摄像头人脸检测_第5张图片

执行2,生成了Makefile等文件;

执行3,生成了face_detector_cam可执行文件;

执行4,摄像头启动,出现人脸,矩形框圈出。

注意:如果没有进行设置,生成文件夹是在项目同级目录下:
Jetson nano 入手系列之6—使用qt creator 开发c++ opencv+CSI摄像头人脸检测_第6张图片

2.2 使用命令行

把生成文件放在项目文件夹下。

mkdir build
cd build
cmake ..
make
./face_detector_cam

通过可执行文件启动摄像头人脸检测功能。

Jetson nano 入手系列之6—使用qt creator 开发c++ opencv+CSI摄像头人脸检测_第7张图片

参考文献

[1] Jetson Nano 从入门到实战(案例:Opencv配置、人脸检测、二维码检测)
[2] Jetson nano 入手系列之2—板载摄像头IMX219启动
[3] JetsonHacksNano/CSI-Camera
[4] ACCELERATED GSTREAMER USER GUIDE

你可能感兴趣的:(Jetson,nano系列,c++,opencv,c++,csi摄像头,人脸检测,qt,creator)