本系列针对亚博科技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
进行构建和编译。
打开文件可以看到,初始化文件给出了一个hello world
的demo
:
#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_pipeline
,opencv
检测人脸子函数face_detector
以及在原图显示矩形框的Rect_show
子函数组成。
face_detector
及Rect_show
子函数中分别使用了指针以及引用方式来作为函数参数。
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,生成了Makefile
等文件;
执行3,生成了face_detector_cam
可执行文件;
执行4,摄像头启动,出现人脸,矩形框圈出。
把生成文件放在项目文件夹下。
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