树莓派配置Opencv(C++)
首先准备一个摄像头,连接到树莓派上
树莓派配置
首先执行命令
sudo raspi-config
进入设置页面后,之后按照下面步骤设置
- 选择
Interfacing Options
- 选择
Camera
- 点击
Yes
- 点击
Ok
-
之后重启树莓派
-
验证
执行命令
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++程序的命令行指令,代码的精解:
g++
:这是编译器的名字,g++是GNU编译器的C++版本,用于编译C++代码。-Wall
:这是一个编译选项,表示打开所有警告。这意味着编译器将会对代码中的所有潜在问题发出警告,包括可能未使用的变量、未初始化的变量等。-o "test"
:这是输出选项,指定编译后的可执行文件的名称。在这个例子中,它将编译后的文件命名为"test",此时编译后的test文件就是一个可执行程序,可以 ./test 进行执行。"test.cpp"
:这是要编译的源文件的名称。-lwiringPi
:这是链接选项,表示链接wiringPi库。wiringPi是一个用于树莓派(Raspberry Pi)的C/C++库,用于简化GPIO(General Purpose Input/Output)接口的编程。$(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;
}
同样画质感人,这里我就不展示了!!!