树莓派配置Opencv(C++)

发布时间 2023-08-20 21:49:00作者: 不做签到员

首先准备一个摄像头,连接到树莓派上

树莓派配置

首先执行命令

sudo raspi-config

进入设置页面后,之后按照下面步骤设置

  1. 选择 Interfacing Options

  1. 选择 Camera

  1. 点击 Yes

  1. 点击 Ok

  1. 之后重启树莓派

  2. 验证

    执行命令

    sudo raspistill -o test.jpg 
    

    ​ 指令的意思是在当前的文件下照一张相,名字为test.jpg,之后使用树莓派自带的xdg-open打开test.jpg这个图片,命令为:

    sudo xdg-open test.jpg
    

    ​ 画质感人!!!

    如果安装的摄像头是反着安装的,则可以利用命令控制摄像头进行反向拍摄,命令为:

    sudo raspistill -hf -vf -o test.jpg 
    

    参数 -hf -vf 的意思是从水平和竖直两个方向进行翻转

    还有其它的命令,如:控制树莓派摄像头进行录像

    sudo raspivid -o test.h264 -t 5000
    

    参数-t 是指定录像的时间为5s

安装opencv到树莓派

安装编译好的opencv到树莓派,命令为:

sudo apt-get install libopencv-dev

显示如下,则为成功:

将opecv添加到Geany的编译和构件中,与WiringPi在Geany的配置是类似的,只需要在Compile的后面添加$(pkg-config --cflags --libs opencv)和Build的后面添加$(pkg-config --cflags --libs opencv)

编写代码,名字为test.cpp进行测试:

#include <iostream>
#include <stdio.h>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv; // 使用opencv的命名空间

int main()
{
    Mat img; // Mat类型是矩阵类型
    img = imread("/home/gx/test.jpg");
    imshow("test", img);
    waitKey(0); // 按任何键则关闭窗口
    return 0;
}

注意:如果此时出现下面的编译现象的时候,说明参数的顺序是有问题的,因为g++的参数是有顺序要求的

放置正常的顺序则在编译的时候显示的代码是:

g++ -Wall -o "test" "test.cpp" -lwiringPi $(pkg-config --cflags --libs opencv)

这段代码使用g++编译C++程序的命令行指令,代码的精解:

  1. g++:这是编译器的名字,g++是GNU编译器的C++版本,用于编译C++代码。
  2. -Wall:这是一个编译选项,表示打开所有警告。这意味着编译器将会对代码中的所有潜在问题发出警告,包括可能未使用的变量、未初始化的变量等。
  3. -o "test":这是输出选项,指定编译后的可执行文件的名称。在这个例子中,它将编译后的文件命名为"test",此时编译后的test文件就是一个可执行程序,可以 ./test 进行执行。
  4. "test.cpp":这是要编译的源文件的名称。
  5. -lwiringPi:这是链接选项,表示链接wiringPi库。wiringPi是一个用于树莓派(Raspberry Pi)的C/C++库,用于简化GPIO(General Purpose Input/Output)接口的编程。
  6. $(pkg-config --cflags --libs opencv):这是另一个链接选项,表示链接opencv库。opencv是一个强大的计算机视觉库,用于图像处理和机器视觉。$(pkg-config --cflags --libs opencv)是一个命令,该命令会返回opencv库的编译和链接选项。

所以有上述的精解,可以得出这个命令的目的是编译名为"test.cpp"的C++文件,使用wiringPi库,并链接opencv库,然后将编译后的可执行文件命名为"test"。同时,这个命令会在编译过程中打开所有警告,以便开发者可以找到并修复潜在的问题。

配置opencv识别树莓派mipi摄像头

由于opencv只能识别树莓派的USB摄像头,需要安装V4L2驱动才可以使OpenCV能够识别摄像头

在命令行中输入

sudo nano /etc/modules  

/etc/modules 中添加 bcm2835-v4l2,如下图所示。 之后先按下Control + o,之后按下Enter保存;接着执行Control + x退出编辑。重启树莓派,重启后就可以被opencv识别mipi摄像头

编写测试代码,进行测试:

#include <iostream>
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;  
using namespace cv;  
  
int main(int argc, char** argv)  
{  
    // 打开视频文件  
    VideoCapture cap(0);  
  
    // 检查是否成功打开视频文件  
    if (!cap.isOpened())  
    {  
        std::cerr << "无法打开视频文件" << std::endl;  
        return -1;  
    }  
  
    // 设置窗口大小  
    namedWindow("Video", WINDOW_NORMAL);  
    resizeWindow("Video", 400, 400);  
  
    // 循环播放视频直到按下退出键  
    while (true)  
    {  
        Mat frame;  
  
        // 从视频文件中读取下一帧  
        cap >> frame;  
  
        // 如果读取的帧为空,则视频播放结束,退出循环  
        if (frame.empty())  
            break;  
  
        // 在窗口中显示当前帧  
        imshow("Video", frame);  
  
        // 等待一段时间,然后继续循环(按Q键退出)  
        if (waitKey(30) == 'q' || waitKey(30) == 27) // 'q'键或Esc键  
            break;  
    }  
  
    // 释放视频文件和窗口资源  
    cap.release();  
    destroyAllWindows();  
  
    return 0;  
}

同样画质感人,这里我就不展示了!!!