一直在Fedora平台下写opencv的程序,需要对程序进行调试,主要用的调试工具是gdb. gdb提供了如下功能:
- 1.在程序中设置断点,Debug时遇到断点处暂停
- 2.可以监视某个变量,并利用print函数将该变量的值打印出来
- 3.程序可step-by-step执行
- 4.运行时修改变量的值
- 5.跟踪路径
- 6.线程切换等
下面结合OpenCV针对C\C++程序使用gdb调试进行介绍。
1.gdb安装
首先检查一下电脑中是否已经安装gdb
gdb --version
如果已经存在gdb,则会得到如下结果:
如果没有给出gdb的版本号则需要手动下载
sudo apt-get install gdb #针对Ubuntu系统
sudo dnf install gdb #针对Fedora系统
2.gcc\g++编译基础
在前面我们文章《opencv之在Linux下编译opencv程序的两种方式g++、cmake》介绍过gcc\g++编译的基础内容,当需要使用gdb调试代码时,需要在gcc\g++编译选项中添加-g选项,如下所示:
g++ -g `pkg-config opencv --cflags` opencv.cpp -o opencv `pkg-config opencv --libs`
这样生成的opencv可执行文件可以直接使用gdb进行调试
可以直接在命令行输入gdb+程序名进入调试,在这里使用《opencv学习(三十一)之图像边缘像素填充估计copyMakeBorder()》中的程序进行演示,其代码如下所示:
/*程序说明
*当按下按键‘c’代表使用BORDER_CONSTANT
*RNG生成的随机数作为像素值进行填充
*当按下按键‘r’代表使用BORDER_REPLICATE
*图像扩充的边框由原图像边缘像素的值进行填充
*/
#include <opencv2/imgproc.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
using namespace cv;
//声明全局变量
Mat srcImage, dstImage;
int g_top, g_bottom, g_left, g_right;
int borderType;
Scalar value;
String windowName = "copyMakeBorder Demo";
RNG rng(12345);
int main()
{
int c;
srcImage = imread("dog.jpg");
//判断图像是否加载成功
if(srcImage.empty())
{
cout << "图像加载失败!" << endl;
return -1;
}
else
cout << "图像记载成功" << endl << endl;
imshow("原图像", srcImage);
//程序使用说明
printf("\n \t copyMakeBorder Demo: \n");
printf("\t --------------------\n");