嵌入式小白学习记录)ubuntu安装opencv及其简单应用_jjjean1的博客-爱代码爱编程
(嵌入式小白学习记录)Ubuntu安装opencv及其简单应用
这里写目录标题
Part1:OpenCV的安装
Opencv的安装真的非常折磨人。本小白在安装的过程中主要参考了如下博客:
链接: https://blog.csdn.net/weixin_46129506/article/details/120646081
现就主要出现的几个报错及问题进行说明:
1.pkg-config无法正确连接到opencv
在下载解压好之后,配置路径好之后,运行pkg-config --modversion opencv
时出现报错,提示pkg-config无法找到OpenCV。搜索解决方案后,在/usr/local/下自己创建了一个pkgconfig文件夹从而解决了问题。
2.gcc编译时include无法找到OpenCV下的头文件
在运行gcc test1.cpp -o test1 'pkg-config --cflags --libs --opencv
时出现如上报错。
Part2: OpenCV简单实操:处理图片和视频
处理图片:
打开终端,运行nano test1.cpp
创建一个文件。
编辑如下代码:`#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
CvPoint center;
double scale = -3;
IplImage* image = cvLoadImage("lena.jpg");
argc == 2? cvLoadImage(argv[1]) : 0;
cvShowImage("Image", image);
if (!image) return -1; center = cvPoint(image->width / 2, image->height / 2);
for (int i = 0;i<image->height;i++)
for (int j = 0;j<image->width;j++) {
double dx = (double)(j - center.x) / center.x;
double dy = (double)(i - center.y) / center.y;
double weight = exp((dx*dx + dy*dy)*scale);
uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
ptr[0] = cvRound(ptr[0] * weight);
ptr[1] = cvRound(ptr[1] * weight);
ptr[2] = cvRound(ptr[2] * weight);
}
Mat src;Mat dst;
src = cvarrToMat(image);
cv::imwrite("test.png", src);
cvNamedWindow("test",1); imshow("test", src);
cvWaitKey();
return 0;
然后,对test1.cpp进行编译:g++ test1.cpp -o test1pkg-config --cflags --libs opencv``
对于这句编译代码,它是如何获得opencv头文件,链接lib库文件的路径的呢?
都归功于pkg-config。它可以自动获得编译的预处理参数,如宏定义,头文件的位置。还可以获得链接参数,如库和依赖的其他库的位置,文件名和其他的一些参数。使用pkg-config时,选项–cflags 它是用来指定程序在编译时所需要头文件所在的目录,选项 --libs则是指定程序在链接时所需要的动态链接库的目录。
处理视频
第一步,需要在虚拟机上授权得到电脑摄像头的权限。这里略去过程,可参考博客链接:[https://blog.csdn.net/weixin_46129506/article/details/120646081]
第二步:编写一个test文件:
在Ubuntu中下载好一个视频,之后进行编译:
g++ test2.cpp -o test2 `pkg-config --cflags --libs opencv`
之后执行./test2
便可以看到视频结果
摄像头压缩
OpenCV还可以打开摄像头。首先,确保我们的虚拟机获得了摄像头权限。
编写一个test3.cpp
进行编译并执行后./test3可以发现打开了摄像头。space键进行录制,esc键停止录制。
Q&A:
1)如果要求打开你硬盘上一个视频文件来播放,请问示例代码1第7行代码如何修改?
答:可以修改为如下:VideoCapture capture; Mat frame; frame= capture.open("E:/image/a1.avi");
2)在示例代码1第9行的while循环中,Mat是一个什么数据结构? 为什么一定要加一句waitKey延时代码,删除它行不行?
答: Mat本质上是由两个数据部分组成的类: (包含信息有矩阵的大小,用于存储的方法,矩阵存储的地址等) 的矩阵头和一个指针,指向包含了像素值的矩阵(可根据选择用于存储的方法采用任何维度存储数据)。
waitKey的作用在于给程序一个判断用户按键触发的时间。如果用户在规定时间内没有按键,则跳出循环。waitkey的设置是有必要的,否则程序将会一直等待用户按键。
3)示例代码1代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要用键盘Ctrl+C 强制中断程序,非常不友好。如何改进?
我认为可以在加一个if语句,如果延时函数在按Esc(ASCII码为27)的时候break就可以了。