本文主要记录近期在学习opencv使用过程中的一些细节
前言:ubuntu22.04 OpenCV4.6.0(c++)环境配置
opencv的安装过程可参考下面博文,亲测有效(容易出现问题的地方在安装下面依赖的时候,一般会出现报错,需要自己换源,否则后面可能会出现打不开照片或者打开照片是空白的问题)
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
博文参考:(3条消息) ubuntu22.04 OpenCV4.6.0(c++)环境配置_路飞DoD的博客-CSDN博客
一、查看opencv版本
运行终端,输入下面指令,查看opencv版本
pkg-config --modversion opencv4
会出现下面情况,这里我的opencv版本是4.5.4(不同版本信息显示不同)
若下面指令查询不到,可能是opencv版本问题,可以输入下面命令查看
pkg-config opencv --modversion
二、用c++访问opencv库访问照片,视频,摄像头拍照
在home目录新建文件夹digital
cd digital //进入digital
touch CMakeLists.txt //创建cmake编译文本
mkdir -p build //创建build 文件夹,用于生成系统所需构建文件
mkdir -p img //创建img文件夹,用于存放照片,视频
mkdir -p src //创建src文件夹,用于存放cpp文件
这里先通过下面指令显示我实现后digital 的二层目录
tree -L 2
CMakeLists.txt内容(cmake构建opencv项目)
cmake_minimum_required(VERSION 2.8) //最低版本
project( digital ) //项目名称
find_package( OpenCV REQUIRED ) //添加opencv库到本项目
include_directories( ${OpenCV_INCLUDE_DIRS} ) //添加opencv头文件路径
add_executable( demo src/demo.cpp ) //添加可执行文件
add_executable( demo1 src/demo1.cpp ) //这里对应三个cpp
add_executable( demo2 src/demo2.cpp ) //即访问照片、视频、摄像头
target_link_libraries( demo ${OpenCV_LIBS} ) //链接opencv库到可行性文件
target_link_libraries( demo1 ${OpenCV_LIBS} )
target_link_libraries( demo2 ${OpenCV_LIBS} )
demo.cpp内容(opencv访问照片)
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char** argv)
{
// 读取图片
cv::Mat image = cv::imread("/home/zyf/digital/img/yunyun.jpg");//自己的照片
// 确认图片读取成功
if(image.empty())
{
std::cerr << "Failed to open image file." << std::endl;
return -1;
}
//控制照片比例
resize(image, image, cv::Size(500, 500));
// 显示图片
cv::imshow("Image with Box", image);
// 等待按键
cv::waitKey(0);
return 0;
demo1.cpp内容(opencv访问视频)
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 打开视频文件
VideoCapture cap("/home/zyf/digital/img/video.mp4");//自己的视频文件
// 检查视频是否成功打开
if (!cap.isOpened())
{
std::cout << "Error opening video stream or file" << std::endl;
return -1;
}
// 循环读取视频帧
while (true)
{
Mat frame;
// 读取当前帧
cap >> frame;
// 检查是否成功读取帧
if (frame.empty())
break;
// 显示当前帧
imshow("Frame", frame);
// 按下 Esc 键退出循环
if (waitKey(25) == 27)
break;
}
// 释放VideoCapture对象和所有窗口
cap.release();
destroyAllWindows();
return 0;
}
demo2.cpp内容(opencv访问摄像头)
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
using namespace std;
using namespace cv;
int main()
{
// 打开默认摄像头
VideoCapture cap(0);
if (!cap.isOpened())
{
cout << "无法打开摄像头!" << endl;
return -1;
}
namedWindow("摄像头", WINDOW_NORMAL);
while (true)
{
Mat frame;
cap >> frame;
// 显示视频帧
imshow("摄像头", frame);
// 按下空格键拍照
if (waitKey(30) == ' ')
{
// 生成文件名
time_t now = time(NULL);
tm *ltm = localtime(&now);
string filename = to_string(ltm->tm_year + 1900) + "-" + to_string(ltm->tm_mon + 1) + "-" + to_string(ltm->tm_mday) + "-" + to_string(ltm->tm_hour) + "-" + to_string(ltm->tm_min) + "-" + to_string(ltm->tm_sec) + ".jpg";
// 保存图片
imwrite(filename, frame);
cout << "已保存照片:" << filename << endl;
}
}
return 0;
}
编译实现
cd build //进入build文件夹
cmake ..
make
cmake .. //cmake编译,生成makefile等文件
make //编译,生成可执行文件
此时我们可以看到在build目录会生成可执行文件
运行可执行文件
./demo //执行demo
./demo1 //执行demo1
./demo 2 //执行demo2
./demo opencv访问照片
./demo1 opencv访问视频
./demo2 opencv访问摄像头
空格拍照获取一帧数据,.jpg文件
注意: 这里Linux访问摄像头可能出现黑面现象,先在window访问相机出现下面情况
解决方法:
1.安装cheese
重启电脑
在VMware的工具栏选择虚拟机>可移动设备>摄像头>连接。
执行:sudo apt-get install cheese
运行:cheese(一般可以看到图像)
2、如发现cheese界面弹出后,图像是黑屏,但是摄像头连线无误,按钮都处于不可操作状态,需要检查几个部分:
lsusb查看一下是否有找到摄像头。
ls /dev | grep video,查看是否有video0。
如以上两点都有,需要检查的部分是虚拟机设置>usb控制器>usb兼容性>(usb2.0/3.0)。如果当前选中的是2.0就选择3.0,如果当前选中的是3.0就选择2.0。然后确定。
在VMware的工具栏选择虚拟机>可移动设备>摄像头>断开连接。然后再虚拟机>可移动设备>摄像头名>连接。然后重新打开cheese,发现已经有图像了。
总结:
opencv在linux需要先经过cmake编译安装才能使用,以及下载依赖库,同时还需要配置路径,过程还是有点麻烦,要注意的点是依赖包的下载和路径的配置。
参考文献:
(3条消息) 解决虚拟机下Ubuntu cheese黑屏问题_ubuntu20.04无法打开cheese_cocoaqin的博客-CSDN博客
ubuntu22.04 OpenCV4.6.0(c++)环境配置_路飞DoD的博客-CSDN博客