首页 > 编程语言 >树莓派配置Opencv(C++)

树莓派配置Opencv(C++)

时间:2023-08-20 21:58:47浏览次数:51  
标签:树莓 编译 -- C++ Opencv opencv test include

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

树莓派配置

首先执行命令

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;  
}

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

标签:树莓,编译,--,C++,Opencv,opencv,test,include
From: https://www.cnblogs.com/ambitionx/p/17644681.html

相关文章

  • C++ 虚继承,虚函数与纯虚函数整理
    1.虚继承虚继承是用于解决多继承中“菱形继承”问题的一种技术。在多继承中,如果两个基类都继承了同一个基类,派生类会包含两份该基类的数据成员和函数成员,从而产生冗余和二义性。虚继承的作用就是消除这种冗余。虚继承的定义方式是在继承关系中添加关键字“virtual”,如下所示:cl......
  • C++ 函数指针与Lambda匿名函数
    函数指针c语言学过了,这里简单记一下,下面举例一个用法就行:#include<iostream>#include<vector>template<classT>voidprint(Tv){ std::cout<<v<<std::endl;}template<classT1,classFunc>voidForEach(std::vector<T1>&v,Func......
  • C++ Template
    Template模板,其他语言叫泛型,或者说是泛型的爷爷的爷爷(模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。直接上例子例一先看这段代码:#inc......
  • C++ 可见性
    可见性比较简单,很好理解,长话短说=v=外部的类派生类同一个类private不可访问不可访问可以访问protected不可访问可以访问可以访问public可以访问可以访问可以访问#include<iostream>usingnamespacestd;classA{private: intx;protected......
  • C++ 成员初始化列表
    成员初始化列表成员初始化列表时对象初始化成员变量的一种方法。使用方式如下(两种书写习惯)ClassName(args):varName1(value),...,varNameN(value){//这是一个构造函数//...CODE...}ClassName(args):varName1(value),...,varNameN(value){//这......
  • C++ const和mutable
    const和mutable这里只说const在c++中的特殊用法。用const修饰函数的成员函数。被const修饰的成员函数无法修改函数内的其他成员。可以认为这个函数变成了一个“只读”的状态。Likethis://注意const在括号后面,不要写成constxxxxx(){...}了intgetStatus()const{ returnm......
  • C++ new和delete
    new关键字在C++中,当我们在函数内声明一个变量时,变量会被放在栈(stack)中。栈中的内存离开代码块就被释放了。而且栈的内存很小,当我们声明了大量变量可能会导致内存不足。内存除了栈以外,还有堆(heap),当我们在函数外声明一个全局变量时,这个变量就放在堆上。堆是程序未使用的内存,可以被......
  • c++ 丢失笔记 [运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符]
    运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符有一部分是学校的OJ里做题需要就提前学了,然后没记笔记,有一部分是笔记丢了。不打算补这些笔记。不过还是在这里mark一下++运算符的重载。因为++运算符可以前置也可以后置,所以这里需要注意一下,如果是后置++,需要一个in......
  • C++ 隐式转换与explicit关键字
    隐式转换与explicit关键字隐式转换函数构造的隐式转换,直接上代码:#include<bits/stdc++.h>classEntity{private: std::stringm_Name; intm_Age;public: Entity(conststd::string&name) :m_Name(name),m_Age(-1){} Entity(intage) :m_Name("Unknown"),m_A......
  • C++ Vector数组优化
    Vector数组优化问题这是一段没有优化的代码:#include<iostream>#include<vector>classEntity{public: intx,y;public: Entity(intx,inty) :x(x),y(y){} Entity(constEntity&e) :x(e.x),y(e.y){ std::cout<<"Copied!"<<st......