Linux系统下GDB调试及opencv的使用
- 一、GDB的简介
- 二、GDB的作用
- 三、GDB的使用
- 1. GDB调试举例
- 2.段错误调试
- 3.内存出错的gdb调试
- 四、安装opencv-3.4.1
- 1.下载opencv-3.4.1
- 2. 解压
- 3.编译
- 4.配置OpenCV的编译环境
- 五、进行图像处理
- 六、通过opencv使用摄像头
- 1.配置虚拟机摄像头
- 2.利用摄像头处理视频的程序编写
- 3.利用代码播放视频
- 4.改进后的代码处理摄像头
- 七、总结
一、GDB的简介
GDB : GNU Debugger,是GNU工程为GNU操作系统开发的调试器,但它的使用不局限于GNU操作系统, GDB可以运行在UNIX、Linux甚至Microsoft Windows。 • GDB可以调试C、C++、Objective-C、Pascal、Ada等语言编写的程序;被调试的程序可以跟GDB运行于同一台电脑,也可运行于不同电脑。
二、GDB的作用
- 设置断点使程序停住
- 监视或修改程序中变量的值
- 跟踪代码执行过程
三、GDB的使用
编译程序时,通过gcc的-g选项为程序添加调试信息,例如:
gcc –g –o helloworld helloworld.c
1. GDB调试举例
下面的代码实现对一个整型数的反转功能,比如输入123,则输出321,但输入100时,程序的输出结果却不正确,请找出问题。
include <stdio.h>
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);
}
- 创建一个文件,将上述程序输入,使用gcc可执行代码,并执行,查看程序执行结果
发现在输入123或者234时可以正确输出,但是输入100时输出了错误的结果
- 使用GDB来对代码进行调试
编译时添加-g选项
l 为显示代码行号
b 16为通过行号设置断点
b ShowRevertNum 为通过函数名设置断点
info b 为查看断点所有信息
run/r 为执行程序
whatis iNum 为查看iNum类型
print iNum 为输出iNum的值
c 为继续执行
在使用 c 出现上图错误,使用quit退出调试,我们用next替换c
继续调试,发现输入100是输出为010,在4处重新设置断点,再次调试
此时发现问题该函数在进入循环后,当iNum等于10之后便不再进入循环,这时我们明白问题出现在这里,对iNum的值的比较应该包含10。 - 对程序进行修改,重新执行
得到正确结果
2.段错误调试
建立如下文件
#include<stdio.h>
#include<string.h>
#define BUFSIZE 256
static char acBuf[BUFSIZE];
static char *pStr;
int main(void)
{
printf("Please input a string:");
gets(pStr);
printf("\nYour string is:%s\n",pStr);
}
进行GDB调试,发现出现段错误
逐步进行调试,发现出现问题的地方
3.内存出错的gdb调试
建立如下文件
#include<stdio.h>
int main()
{
int *p=0;
*p=1;
return 0;
}
进行调试,使用代码
`ulimit -c 1000 #字数可变`
让系统产生core文件,运行程序,让程序崩溃,产生core文件
使用gdb配合core文件,定位问题
四、安装opencv-3.4.1
1.下载opencv-3.4.1
在官网下载opencv-3.4.1
下载地址
2. 解压
1.将下载的文件拷贝到home文件,使用下面代码进行解压
unzip opencv-3.4.1.zip
2.解压后进入文件,安装依赖库cmake
cd opencv-3.4.1
sudo apt install cmake
之后执行如下代码
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
3.编译
1.执行命令,创建编译文件夹并进入文件夹进行配置
mkdir my_build_dir
cd my_build_dir
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
2.执行编译
sudo make
等待
下载完成
执行命令
sudo make install
至此编译结束
4.配置OpenCV的编译环境
先将OpenCV的库添加到路径,从而可以让系统找到
sudo gedit /etc/ld.so.conf.d/opencv.conf
在弹出的空白文件上输入
/usr/local/lib
保存,执行如下命令使得刚才的配置路径生效,并配置bash
sudo ldconfig
sudo gedit /etc/bash.bashrc
在弹出的文件末尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
保存,执行如下命令使得配置生效,并更新
source /etc/bash.bashrc
sudo updatedb
至此安装opencv-3.4.1并配置成功
五、进行图像处理
1.在opencv-3.4.1下新建文件夹mytest
2.选择一张图片保存到目录下命名
3.创建函数
#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("ITACHI.JGP");
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;
}
利用如下命令
touch test.cpp
gedit test.cpp
4.编译并执行
解释
编译cpp文件用g++ test.c -o test 编译生成可执行文件
pkg-config:
1、检查库的版本号,避免连接错误版本的库文件
2、获取编译预处理参数,如宏定义、头文件位置
3、获得链接参数,如库及以来的其它库位置,文件名及其它一些连接参数
4、自动加入所以来的其他库位置
而-cflags是用来指定程序再编译时需要的头文件所在目录
-libs是指定程序再链接时所需要的动态链接库的目录
以此来获取opencv的头文件与库文件
产生可执行文件
运行成功
六、通过opencv使用摄像头
1.配置虚拟机摄像头
Win+R打开cmd 输入services.msc把虚拟机的USB服务打开
在虚拟机菜单栏中选择“虚拟机(M)”->选择“可移动设备”->选择“xxxx Camera”->选择“连接(断开与主机连接)”,设置完这项之后,虚拟机接管了笔记本摄像头。
在Vmware Workstation的“虚拟机”->“虚拟机设置”->“USB控制器”下,查看“USB兼容性”,如果当前是“USB2.0”就修改为“USB3.0”,反之就修改为“USB2.0”。
2.利用摄像头处理视频的程序编写
创建如下文件
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture capture(0);
while(1)
{
Mat frame;
capture >> frame;
imshow("读取视频帧",frame);
waitKey(30);
}
system("pause");
return 0;
}
编译并运行,结果如下,可以打开摄像头
代码解释:
1、如果要求打开你硬盘上一个视频文件来播放,请问第7行代码如何修改?
VideoCapture capture(“视频名.mp4”);
2、Mat是一个数组,用来存放一帧图片的像素点,每个像素点对应一个RGB值,可以显示当前像素色块
3、读帧时做一定延时是为了达到正常播放,据统计每秒显示 27、28帧时,如果没有延时,那么运行后画面马
上就消失了,还没看到画面就没了。所以waitKey函数必不可少,最好延时30ms左右
4、此代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要在终端用
键盘Ctrl+C 强制中断程序如果想要控制视频暂停或者播放可以在下面加入下面语句,空格即可以控制暂停、
3.利用代码播放视频
第七行代码改为如下:
VideoCapture capture("ps.mp4"); //括号里面ps.mp4是视频文件名字
再次编译并运行,成功播放视频
4.改进后的代码处理摄像头
代码可以实现录制视频,按空格开始录制,再按空格结束录制,ESC停止录制并保存
将上述代码改为如下
#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
cout << "error" << endl;
waitKey(0);
return 0;
}
int w = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));
int h = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
Size videoSize(w, h);
VideoWriter writer("RecordVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, videoSize);
Mat frame;
int key;
char startOrStop = 1;
char flag = 0;
while (1)
{
cap >> frame;
key = waitKey(100);
if (key == 32)
{
startOrStop = 1 - startOrStop;
if (startOrStop == 0)
{
flag = 1;
}
}
if (key == 27)
{
break;
}
if (startOrStop == 0 && flag==1)
{
writer << frame;
cout << "recording" << endl;
}
else if (startOrStop == 1)
{
flag = 0;
cout << "end recording" << endl;
}
imshow("picture", frame);
}
cap.release();
writer.release();
destroyAllWindows();
}
编译并执行,空格为控制录制视频的开始与截止,按ESC退出并保存视频
七、总结
了解了Linux下GDB调试的使用方法,在以后的程序编写中,可以利用GDB调试更方便快捷的找到错误所在。
下载opencv-3.4.1后,学会了在虚拟机上使用摄像头,了解到了图片和视频处理的乐趣,妈妈再也不担忧我不会图像编程啦!
感谢一下博主的帮助。
参考链接:
https://blog.csdn.net/hhhhhh277523/article/details/109207035
https://blog.csdn.net/wlzany/article/details/109320966
https://blog.csdn.net/wlzany/article/details/109260901
https://cungudafa.blog.csdn.net/article/details/84451066
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)