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

news2024/11/15 8:31:24

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 创建并配置项目

  • 新建项目
    在这里插入图片描述

  • 输入项目名称和位置;
    在这里插入图片描述

  • build system选择CMake;
    在这里插入图片描述

  • 配置好的初始化项目由一个cpp文件及CMake文件组成;
    在这里插入图片描述

1.2 编辑文件

1.2.1 main.cpp

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

#include <iostream>
#include <string>
#include <opencv4/opencv2/opencv.hpp>
#include <opencv4/opencv2/core.hpp>
#include <opencv4/opencv2/highgui.hpp>
#include <opencv4/opencv2/imgproc.hpp>
#include <opencv4/opencv2/objdetect.hpp>
#include <opencv4/opencv2/imgproc/types_c.h>
#include <opencv4/opencv2/videoio.hpp>

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完成

在这里插入图片描述

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

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

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

注意:如果没有进行设置,生成文件夹是在项目同级目录下:
在这里插入图片描述

2.2 使用命令行

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

mkdir build
cd build
cmake ..
make
./face_detector_cam

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

在这里插入图片描述

参考文献

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一篇文章带你学会MySQL数据库的基本管理

目录 前言 一、数据库的介绍 二、mariadb的安装 三、数据库的开启及安全初始化 四、数据库的基本管理 五、数据库密码更改及破解 六、用户授权 七、数据库的备份 八、phpmyadmin的安装 总结 前言 什么是数据库&#xff1f; 每个人家里都会有衣柜&#xff0c;衣柜是…

前端效果积累 | 酷炫、实用3D地球路径飞行效果实现

&#x1f4cc;个人主页&#xff1a;个人主页 ​&#x1f9c0; 推荐专栏&#xff1a;前端开发成神之路 --【这是一个为想要入门和进阶前端开发专门开启的精品专栏&#xff01;从个人到商业的全套开发教程&#xff0c;实打实的干货分享&#xff0c;确定不来看看&#xff1f; &…

【C语言进阶】自定义类型之结构体

目录一&#xff1a;结构体1.1&#xff1a;结构的基础知识&#xff1a; 1.2&#xff1a;结构的声明&#xff1a; 1.3&#xff1a;特殊声明&#xff08;匿名结构体&#xff09;&#xff1a; 1.4&#xff1a;结构的自引用&#xff1a; 1.5&#xff1a;结构体变量的定义和初始化&am…

springboot 项目自定义log日志文件提示系统找不到指定的文件

自己尝试搭建了一个springboot项目&#xff0c;自定义了log日志文件&#xff0c;启动后报错 Logging system failed to initialize using configuration from logback-spring.xml java.io.FileNotFoundException: E:\code_demo\xxxx\logback-spring.xml (系统找不到指定的文件…

Elasticsearch(二)--Elasticsearch客户端讲解

一、前言 在上一章我们大致了解了下elasticsearch,虽说上次的内容全是八股文&#xff0c;但是很多东西还是非常有用的&#xff0c;这些哪怕往小说作为面试&#xff0c;往大说是可以帮你很快的理解es是个什么玩意儿&#xff0c;所以还是非常推荐大家去看一下上一章内容。 这一章…

【C++】map和set的使用

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;关联式容…

码二哥的技术专栏 总入口

已发表的技术专栏&#xff08;订阅即可观看所有专栏&#xff09; 0  grpc-go、protobuf、multus-cni 技术专栏 总入口 1  grpc-go 源码剖析与实战  文章目录 2  Protobuf介绍与实战 图文专栏  文章目录 3  multus-cni   文章目录(k8s多网络实现方案) 4  gr…

JVM整理笔记之测试工具JCStress的使用及其注解的应用

文章目录前言如何使用JCStress测试代码JCStress 注解说明前言 如果要研究高并发&#xff0c;一般会借助高并发工具来进行测试。JCStress&#xff08;Java Concurrency Stress&#xff09;它是OpenJDK中的一个高并发测试工具&#xff0c;它可以帮助我们研究在高并发场景下JVM&a…

RecyclerView 倒计时和正计时方案

本章内容一.方案制定二.设计三.编码相信不少同学都会在这里栽跟头&#xff0c;在思考这个问题设计了两套方案&#xff0c;而我的项目需求中需要根据业务是否反馈来进行倒计时和正计时的操作。一.方案制定 1.在Adapter中使用CountDownTimer 2.修改数据源更新数据 3.只修改页面展…

leetcode--各种数据结构相关的题

数据结构1.数组&#xff08;1&#xff09;找到所有数组中消失的数字(448)&#xff08;2&#xff09;旋转图像(48)&#xff08;3&#xff09;搜索二维矩阵 II(240)&#xff08;4&#xff09;最多能完成排序的块(769)2.栈和队列&#xff08;1&#xff09;用栈实现队列(232)&#…

“链引擎”(PBC)计划 | 太保集团长安链应用展示

引言 长安链“链引擎”计划&#xff08;Powered by Chainmaker&#xff09;(简称&#xff1a;PBC计划)是由长安链生态联盟发起的一项应用赋能计划&#xff0c;旨在以长安链技术体系为核心支撑&#xff0c;汇聚产业各方力量&#xff0c;为应用方提供技术、品牌、生态等支持&…

面试干货!初级软件测试面试题及答案题库一起奉上

软件测试工程师面试通常要经历技术面以及HR面&#xff0c;HR面一般都是日常问题&#xff0c;面试人可以临场发挥过去&#xff0c;但关乎岗位职责的技术面&#xff0c;可就没那么容易了&#xff0c;尤其是对于很多初次去面试测试岗位的没有任何测试岗位面试经验的转行人员&#…

Java并发面试题

基础知识 并发编程的优缺点 为什么要使用并发编程&#xff08;并发编程的优点&#xff09; 充分利用多核CPU的计算能力&#xff1a;通过并发编程的形式可以将多核CPU的计算能力发挥到极致&#xff0c;性能得到提升方便进行业务拆分&#xff0c;提升系统并发能力和性能&#…

【网络安全】内网介绍+windows信息收集(含命令)

目录 前言 一、内网渗透测试是什么&#xff1f; 1.介绍 2.内外网区别 3.工作组是什么&#xff1f; 4.域是什么&#xff1f; 5.域的知识点 6.活动目录 7.活动目录主要功能 8.域权限 二、windows信息收集 &#xff08;1&#xff09;系统信息 &#xff08;2&#xff0…

【pandas】17 数据处理和绘图

【pandas】17 数据处理和绘图 2023.1.16 pandas数据处理方法和绘图&#xff1a;读取数据、更改数据、时间数据等 主要参考&#xff1a;https://mofanpy.com/tutorials/data-manipulation/pandas/time 17.1运算方法 17.1.1 筛选赋值运算 就是用前面的方法对数据进行筛选&#…

AI中Deepfake的部分研究前沿与文献综述

AI中Deepfake的部分研究前沿与文献综述一、研究现状二、典型算法&#xff1a;三、存在问题四、未来的研究热点参考文献&#xff1a;一、研究现状 由于Deepfake其潜在的安全威胁&#xff0c;它已经引起了学术界和工业界的研究兴趣。为了减轻这种风险&#xff0c;人们提出了许多…

【Nginx01】Ngnix入门

1.版本 Nginx开源版Nginx plus商业版OpenrestyTengine 2.Nginx开源版安装 2.1下载 2.2编译安装 如果本身没有c语言的编译器 命令&#xff1a; yum install -y gcc 解压Nginx 命令&#xff1a; tar -zxvf nginx-1.22.1.tar.gz 安装perl库 命令&#xff1a; yum install -y p…

广告业务系统 之 敏捷交付 —— “基于 Docker 容器同机部署”

文章目录广告业务系统 之 敏捷交付 —— “基于 Docker 容器同机部署”服务 Docker 构建及部署代码支持服务打包&构建服务部署广告业务系统 之 敏捷交付 —— “基于 Docker 容器同机部署” 服务 Docker 构建及部署 在 ADX 系统中&#xff0c;全链路涉及 大大小小的微服务…

SpringBoot+VUE前后端分离项目学习笔记 - 【22 权限菜单 下】

本节主要实现用户角色菜单分配功能&#xff0c;并且实现前端的动态渲染以及动态路由 数据库&#xff1a; sys_user表增加role字段; sys_role增加flag字段;sys_menu表增加page_path字段。前两者表示用户角色标识&#xff0c;后者是前端页面vue路径&#xff0c;用以实现动态路由 …

verilog学习笔记- 13)呼吸灯实验

目录 简介&#xff1a; 实验任务&#xff1a; 硬件设计&#xff1a; 程序设计&#xff1a; 下载验证&#xff1a; 简介&#xff1a; 呼吸灯采用 PWM 的方式&#xff0c;在固定的频率下&#xff0c;通过调整占空比的方式来控制 LED 灯亮度的变化。PWM即脉冲宽度调制&#x…