嵌入式程序调制与opencv图像库

您所在的位置:网站首页 如何安装opencv库 嵌入式程序调制与opencv图像库

嵌入式程序调制与opencv图像库

2022-12-28 03:27| 来源: 网络整理| 查看: 265

目录 一. 在Ubuntu系统上练习程序代码的GDB调试1.GDB部分命令2.GDB调试简单举例分析 二. opencv图像库下的学习和运用1.安装opencv2.Linux下编程 三.使用opencv库编写代码打开摄像头和压缩视频1.编写一个打开摄像头的程序代码并执行2.编写代码用于播放视频3.Mat数据结构和waitKey延时代码以及改进中断程序命令 四. 小结

一. 在Ubuntu系统上练习程序代码的GDB调试 1.GDB部分命令 • whatis 显示变量或函数类型。 • break 在代码里设断点,这将使程序执行到这里时被 挂起。 • info break 显示当前断点清单,包括到达断点处的次数等。 • info files 显示被调试文件的详细信息。 • info func 显示所有的函数名称。 • info local 显示当函数中的局部变量信息。 • info prog 显示被调试程序的执行状态。 • delete [n] 删除第n个断点。 • disable[n] 关闭第n个断点。 • enable[n] 开启第n个断点。 • ptype 显示结构定义。 • set variable 设置变量的值。 • call name(args) 调用并执行名为name,参数为args的函数。 • Finish 终止当前函数并输出返回值。 • return value 停止当前函数并返回value给调用者。 • break命令的使用 – 根据行号设置断点: • (gdb) break linenum – 根据函数名设置断点: • (gdb) break funcname – 执行非当前源文件的某行或某函数时停止执行: • (gdb) break filename:linenum • (gdb) break filename:funcname – 根据条件停止程序执行: • (gdb) break linenum if expr • (gdb) break funcname if expr 2.GDB调试简单举例分析

下面的代码实现对一个整型数的反转功能,比如输入123,则 输出321。 但输入100时,程序的输出结果却不正确,请找出问题。

#include void ShowRevertNum(int iNum) { while (iNum > 10) { printf("%d", iNum % 10); iNum = iNum / 10; } printf("%d\n", iNum); } int main(void) { int iNum; printf("Please input a number :"); scanf("%d", &iNum); printf("After revert : "); ShowRevertNum(iNum); }

a.首先我们touch命令先创建一个.c文件,gedit进入编写以上程序: b.编译程序并进入调制: c.如示显示代码及其行号: d.通过行号设置断点: e.通过函数名设置断点 f.如示查看断点信息: g.运行程序: h.输入100可得如下调试结果: i.查看iNum类型: j.继续执行可得到以下内容: k. Linux中,程序崩溃时,一般会产生core文件,记录进程退出前 的状态,调试段错误问题,借助于该文件,可快速定位问题。 • 可按如下步骤生成和使用core文件 – Step 1: 让系统产生core文件 • ulimit –c num #设定core文件容量(num为数字,为0 是不产生core文件) – Step 2: 运行程序,让程序崩溃,从而生成core文件 – Step 3: gdb配合core文件,定位问题 • gdb 程序名 core文件名 • 比如: gdb segDemo core l.其他调试方法 利用printf + 条件编译,来辅助调试。 测试版:gcc –o mystrdup -DDEBUG 发布版:gcc –o mystrdup

二. opencv图像库下的学习和运用 在Ubuntu16/18系统下练习编译、安装著名的C/C++图像处理开源软件库 Opencv3.x 。安装成功后: 1.安装opencv

1.进入网址下载下载地址 2.将下载好的安装包复制到Ubuntu文件夹中:

3.在Ubuntu下进行解压: 4.进入到解压后的文件包中 5.安装依赖库和cmake ,输入下面命令: 以及后续命令: 以上两个命令如下:

sudo apt-get install cmake sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev

如果在后面步骤操作中出现问题,就返回来在上面第二个命令之前先运行以下三个命令,在执行上面第二个命令,再进行后面的操作:

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" sudo apt update sudo apt install libjasper1 libjasper-dev

6.安装完cmake之后创建一个编译文件夹,并进入输入命令cmake配置一下: 以上命令如下:

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

7.然后执行sudo make命令并等待: 8.执行命令sudo make install,sudo make install 执行完毕后OpenCV编译过程就结束了,接下来就需要配置一些OpenCV的编译环境首先将OpenCV的库添加到路径,从而可以让系统找到 9.执行此命令:

sudo gedit /etc/ld.so.conf.d/opencv.conf

打开的可能是一个空白的文件,不用管,需要在文件末尾添加:

/usr/local/lib

10.保存回到命令行界面,执行如下命令使得刚才的配置路径生效: 11.然后再配置bash:

sudo gedit /etc/bash.bashrc

12.编辑该文件在其最末尾添加:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH

13.然后保存再执行如下命令使得配置生效:

source /etc/bash.bashrc

14.最后更新,更新完之后所有配置就已完成:

sudo updatedb 2.Linux下编程

1.在opencv-3.4.1下新建一个文件夹tt:

cd opencv-3.4.1 mkdir tt

2.创建test.cpp,然后进入编辑以下代码:

#include #include 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;iheight;i++) for (int j = 0;jwidth;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; }

然后保存: 然后以下编译代码:

gcc test.cpp -o test `pkg-config --cflags --libs opencv`

3.然后运行命令./test即可出现添加的图片,以下是对比图:

三.使用opencv库编写代码打开摄像头和压缩视频 1.编写一个打开摄像头的程序代码并执行

1.首先我们先进入opencv-3.4.1文件里面的之前创建的tt文件夹,创建一个test1.cpp文件,并进入文件编辑:

[email protected]:~/opencv-3.4.1$ cd tt [email protected]:~/opencv-3.4.1/tt$ touch test1.cpp [email protected]:~/opencv-3.4.1/tt$ gedit test1.cpp

2.将以下代码写入并保存:

#include using namespace cv; int main() { VideoCapture capture(0); while(1) { Mat frame; capture >> frame; imshow("读取视频帧",frame); waitKey(30); } system("pause"); return 0; }

此时我们查看tt文件夹,就会发现已经生成该cpp文件: 3.我们再一次输入以下命令:

g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv` //先创建可执行文件 ./test1 //执行该文件

4.如果出现下错误: 那么我们就需要进行接下来的操作: 然后选择该项并确定: 如果结果以上的处理,执行./test1文件时问题还是没有解决,则进行下一步骤4处理: 4.进入以下设置: 如果是usb3.0就改成usb2.0,反之如果是usb3.0就改成usb2.0,确定然后重启虚拟机。 5.重新运行步骤3的命令,就可以打开摄像头了: 如果要退出,就在命令行输入Ctrl+c执行就可退出录制。

2.编写代码用于播放视频

1.首先我们先复制一个视频到当前tt文件夹,即与之前代码test.cpp于同一文件夹中:

2.双击视频文件,如果打不开,他会提示安装某文件,然后使用sudo apt-get install vlc命令来安装。 3.安装好后我们在当前tt目录下新建一个test2.cpp,将test文件中的代码拷贝进去,然后把第七行代码改为如下(括号里时视频文件的名字):

VideoCapture capture("VID20181230124413.mp4");

4.然后依次执行下面命令:

g++ test2.cpp -o test1 `pkg-config --cflags --libs opencv` //先创建可执行文件 ./test2 //执行该文件

便可播放视频!如下: 退出就输入命令Ctrl+c回车即可。

3.Mat数据结构和waitKey延时代码以及改进中断程序命令

1.Ma由两部分数据组成:矩阵头和一个指向所有像素值的矩阵的指针 2.而waitkey命令控制着imshow的持续时间,如果imshow之后不跟waitkey,相当于没有给imshow提供时间展示图像,就会出现只有一个空窗口一闪而过,所以必须加waitkey。 3.因为上面介绍的播放视频和录制功能只能通过命令Ctrl+c才能退出,所以我们进行改进: test1.cpp改进如下,之后便可通过esc键退出了:

#include using namespace cv; int main() { VideoCapture capture(0); int key; while(1) { Mat frame; capture >> frame; key = waitKey(100); if (key == 27) { break; } imshow("读取视频帧",frame); waitKey(30); } system("pause"); return 0; } 四. 小结

通过本次嵌入式程序调制与opencv图像库在Ubuntu下的操作实践,让我收获很多,学到了很多新的东西和技巧,了解了一些新的命令以及在Ubuntu下安装opencv图像库,过程虽然艰辛但是收益良多,学到了在Ubuntu下编写程序再运用命令打开电脑摄像头录制视频以及打开视频进行播放,受益颇丰!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3