在开发套件上运行一些样例

George Donne

2024-07-09

2024-06-19

测试USB摄像头

目录结构:

camera
├── build
├── CMakeLists.txt
└── src
    └── testv.cpp

CMakeList.txt 内容如下:

~/camera$ cat CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(camera )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( demo src/testv.cpp )
target_link_libraries( demo ${OpenCV_LIBS} )

testv.cpp 的内容如下:

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main()
{
        cout << "open camera..." << endl;
	VideoCapture capture(0);
	cout << "camera opened." << endl;

	while (1)
	{
		Mat frame;
		capture >> frame;
		imshow("读取视频帧", frame);
		waitKey(30);
	}

	system("pause");
	return 0;
}
                      
//原文链接:https://blog.csdn.net/qq_43279579/article/details/109289755
//g++ test.cpp -o test `pkg-config --cflags --libs opencv`

进入 build 目录,执行 cmake ..

~/camera/build$ cmake ..
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /usr/local (found version "4.10.0") 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/gdv2/camera/build

再执行 make 命令

~/camera/build$ make
[ 50%] Building CXX object CMakeFiles/demo.dir/src/testv.cpp.o
[100%] Linking CXX executable demo
[100%] Built target demo

运行程序 demo

~/camera/build$ ./demo
open camera...
camera opened.

如果无法打开摄像头,通常是因为权限不足。可通过以下命令增加权限,即可。

~/camera/build$ ls -l /dev/video0
crw-rw----+ 1 root video 81, 0 Jun 19  2024 /dev/video0
~/camera/build$ sudo chmod o+rw /dev/video0
~/camera/build$ ls -l /dev/video0
crw-rw-rw-+ 1 root video 81, 0 Jun 19  2024 /dev/video0

可在console上执行,以方便打开图形界面。


显示图片

目录结构:

digital
├── build
├── CMakeLists.txt
├── img
│   └── jnu2.jpg
└── src
    └── demo.cpp

CMakeList.txt 内容如下:

cmake_minimum_required(VERSION 3.0)
project( digital )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( demo src/demo.cpp )
target_link_libraries( demo ${OpenCV_LIBS} )

demo.cpp 的内容如下:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

using namespace std;
using namespace cv;

Mat src;

int main(int argc, char ** argv)
{
        src = imread("/home/gdv2/testv/digital/img/jnu2.jpg");//这里是你的图片
        if (src.empty())
        {
        cout << "没有读取到图像" << endl;
        return -1;
        }
        cout << "to show image ..." << endl;
    imshow("hello", src);
        cout << "end of showing image ..." << endl;
    waitKey(0);
        return 0;
}

进入 build 目录,执行 cmake ..

~/digital/build$ cmake ..
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /usr/local (found version "4.10.0") 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/gdv2/digital/build

再执行 make 命令

~/digital/build$ make
[ 50%] Building CXX object CMakeFiles/demo.dir/src/demo.cpp.o
[100%] Linking CXX executable demo
[100%] Built target demo

运行程序 demo

~/digital/build$ ./demo
to show image ...
end of showing image ...

可在console上执行,以方便打开图形界面。


人脸检测

目录结构:

face
├── build
├── CMakeLists.txt
├── img
│   ├── face01.png
│   └── face02.jpg
├── src
│   └── face.cpp
└── xml
    └── haarcascade_frontalface_alt2.xml

CMakeList.txt 内容如下:

cmake_minimum_required(VERSION 3.0)
project(face )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( face src/face.cpp )
target_link_libraries( face  ${OpenCV_LIBS} )

face.cpp 的内容如下:

#include <opencv2/opencv.hpp>
//#include <opencv.hpp>
#include <iostream>
#include <opencv2/face.hpp>
 
using namespace std;
using namespace cv;
 
int main(int argc, char *argv[])
{
    Mat img = imread("/home/gdv2/testv/face/img/face02.jpg");
    namedWindow("display");
    imshow("display", img);
 
    /*********************************** 1.加载人脸检测器  ******************************/
    // 建立级联分类器
    CascadeClassifier cascade;
    // 加载训练好的 人脸检测器(.xml)
    //注意路径问题,当前目录的上一个目录中的xml文件夹下
    const string path = "/home/gdv2/testv/face/xml/haarcascade_frontalface_alt2.xml";
    if (!cascade.load(path))
    {
        cout << "cascade load failed!\n";
    }
 
    //计时
    double t = 0;
    t = (double)getTickCount();
    /*********************************** 2.人脸检测 ******************************/
    vector faces(0);
    cascade.detectMultiScale(img, faces, 1.1, 2, 0, Size(30, 30));
 
    cout << "detect face number is :" << faces.size() << endl;
    /********************************  3.显示人脸矩形框 ******************************/
 
    if (faces.size() > 0)
    {
        for (size_t i = 0; i < faces.size(); i++)
        {
            rectangle(img, faces[i], Scalar(150, 0, 0), 3, 8, 0);
 
        }
    }
    else cout << "未检测到人脸" << endl;
 
    t = (double)getTickCount() - t;  //getTickCount():  Returns the number of ticks per second.
    cout << "检测人脸用时:" << t * 1000 / getTickFrequency() << "ms (不计算加载模型的时间)" << endl;
 
    namedWindow("face_detect");
    imshow("face_detect", img);
    waitKey(0);
    
    destroyWindow("display");
    destroyWindow("face_detect");
    return 0;
}

haarcascade_frontalface_alt2.xml,查找 openCV 的安装结果,复制了一个过来的。

进入 build 目录,执行 cmake ..

~/face/build$ cmake ..
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /usr/local (found version "4.10.0") 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/gdv2/face/build

再执行 make 命令

~/face/build$ make
[ 50%] Building CXX object CMakeFiles/face.dir/src/face.cpp.o
[100%] Linking CXX executable face
[100%] Built target face

运行程序 face

~/face/build$ ./face
detect face number is :4
检测人脸用时:386.124ms (不计算加载模型的时间)

可在console上执行,以方便打开图形界面。

找了个合影图片,有3张脸。检测到了2张脸,有1张脸未检测到;还框了2处不是脸的部分。后续再检查。


主要参考资料