Linux系统下GDB调试及opencv的使用

2023-05-16

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的作用

  1. 设置断点使程序停住
  2. 监视或修改程序中变量的值
  3. 跟踪代码执行过程

三、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);
}
  1. 创建一个文件,将上述程序输入,使用gcc可执行代码,并执行,查看程序执行结果在这里插入图片描述
    在这里插入图片描述

发现在输入123或者234时可以正确输出,但是输入100时输出了错误的结果

  1. 使用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. 对程序进行修改,重新执行
    在这里插入图片描述
    在这里插入图片描述
    得到正确结果

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;
	}

	//获得cap的分辨率
	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;//0  开始录制视频; 1 结束录制视频
	char flag = 0;//正在录制标志 0-不在录制; 1-正在录制

	while (1)
	{
		cap >> frame;
		key = waitKey(100);
		if (key == 32)//按下空格开始录制、暂停录制   可以来回切换
		{
			startOrStop = 1 - startOrStop;
			if (startOrStop == 0)
			{
				flag = 1;
			}
		}
		if (key == 27)//按下ESC退出整个程序,保存视频文件到磁盘
		{
			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(使用前将#替换为@)

Linux系统下GDB调试及opencv的使用 的相关文章

随机推荐

  • 多线程CompletableFuture之常用方法示例

    文章目录 前期准备1 runAsync2 supplyAsync3 thenRunAsync4 thenAcceptAsync5 runAfterBothAsync6 thenCombineAsync7 exceptionally8 han
  • 算法题解-- stl

    周末舞会 题目描述 假设在周末舞会上 xff0c X 名男士和 Y 名女士进入舞厅时 xff0c 各自排成一队 xff0c 并分别按顺序编号 跳舞开始时 xff0c 依次从男队和女队的队头上各出一人配成舞伴 规定每个舞曲只能有一对跳舞者 跳
  • 简说spring 的设计模式

    spring 的设计模式 xff08 23种 xff08 面试题 xff09 说说BeanFactory和FactoryBean的实现原理和区别 xff1f spring 中你还知道哪些设计模式 xff1f xff1f 1 简单工厂模式 实
  • 【转载】MathGL中报错:undefined reference to `mgl_create_graph‘的解决方法

    概述 xff1a 在环境 xff1a ubuntu 20 04 中 成功下载好了mathGL xff0c 但是最后编译却报错 undefined reference to 96 mgl create graph 39 如下 xff1a 各种
  • 第十三届蓝桥杯 C/C++ 大学B组 题解

    第十三届蓝桥杯 C C 43 43 大学B组 题解 A 进制计算简单模拟 span class token macro property span class token directive hash span span class tok
  • Android12系统源码目录简单分析

    在这里插入图片描述 https img blog csdnimg cn 07a0627ec4754074b5b621cb3e4dae4d png 上面这么多文件夹 xff0c 有些是一直不需要去理会的 xff0c 比如说接触较多的文件夹 x
  • 应用层与内核层的区别

    应用层 xff1a 主要操作用户空间 xff0c 主要编写逻辑 xff0c 打印信息调用标准库里面的printf函数 内核层 xff1a 主要操作内核空间 xff0c 实现五大管理 xff1a 进程管理 xff0c 内存管理 xff0c 文
  • ubuntu软件:录制视频和截图工具,压缩视频

    1 自带录制视频工具 xff1b 使用方式 xff1a 无需下载 开始录屏 结束录屏 xff1a Ctrl 43 Alt 43 Shift 43 r 当看到 Ubuntu 桌面的右上方多了一个红色的小圆点 xff0c 代表正在录制 注意 x
  • Eth-trunk :LACP模式链路聚合实战

    Eth trunk LACP模式链路聚合实战 需求描述 PC1和PC3数据vlan10 xff0c 网段为192 168 10 0 24PC2和PC4数据vlan20 xff0c 网段为192 168 20 0 24确保设备之间互联互通 x
  • Test Case Framework (TCF) tcf itp 基本使用(二)

    查看机器是否支持itp tcf ls v interfaces power itp0 instrument
  • PDF发送短信2

    SMS是由Esti 所制定的一个规范 xff08 GSM 03 40 和 GSM 03 38 xff09 有两种方式来发送和接收SMS消息 xff1a 文本模式或者PDU xff08 protocol description unit xf
  • maven 打包资源文件需要注意的问题

    初衷 我写这篇博客的目的是想让大家了解一些 maven 项目的结构以及打包后是什么样子的 xff0c 方便大家在实际项目中去排查问题 比如 xff1a 我明明在 src main java 下把 mybatis 的 xml 写上了 xff0
  • Linux服务器Ubuntu上搭建Jenkins+Pytest+Gitee+Allure自动化

    一 安装Jenkins和Java Jenkins 是一个开源自动化服务器 xff0c 它可以自动执行软件持续集成和交付中涉及的重复性技术任务 Jenkins 易于安装且基于 Java xff0c 此外 xff0c 可以使用 Web 界面轻松
  • Python Cookbook学习总结

    第一章 xff1a 数据结构和算法 任何序列 xff08 可迭代的对象 xff09 都可以通过一个简单的赋值操作来分解为单独的变量 xff0c 唯一的要求是变量的总数和结构要与序列相吻合 xff08 比如对于存储二维坐标等的二维数组 xff
  • FreeRTOS入门——STM32下完成一个基于FreeRTOS的多任务程序

    文章目录 一 什么是FreeRTOS二 裸机系统与多任务系统1 裸机系统2 多任务系统3 系统之间的对比 三 实验要求四 实验准备五 在KEIL新建 FreeRTOS 工程1 新建本地工程文件夹2 使用 KEIL 新建工程3 在 KEIL
  • natnet/vrpn_cliernt环境配置

    vrpn sdk的频率上限就是60hz xff0c 想要提高频率可以使用natnet client进行话题接收 1 basalt vrpn client src下需要的其他package vrpn catkin glog catkin ca
  • 无人机集群学习

    natnet sdk4 0 学习 中文介绍 xff1a NatNet SDK Wiki 示例工程 xff1a NatNet Sample Projects NaturalPoint Product Documentation Ver 2 2
  • Nginx证书管理

    一 下载证书到本地 Nginx服务器上传 管理SSL证书 xff0c 将SSL证书压缩包下载到本地后 xff0c 加压Nginx服务器证书的压缩包文件 cert file name pem PEM格式的证书文件 xff0c PEM格式的证书
  • 【ESP32】arduino中的ESP32实时系统FreeRTOS使用教程(一)

    ESP32 FreeRTOS 任务的状态任务的优先级 创建任务传递给任务函数的参数结构体多参数传递互斥量MutexESP32的双核心固定频率运行任务软件定时器 简单的本节略过 xff0c 详细的可以看视频 xff1a 单片机ESP32上的F
  • Linux系统下GDB调试及opencv的使用

    Linux系统下GDB调试及opencv的使用 一 GDB的简介二 GDB的作用三 GDB的使用1 GDB调试举例2 段错误调试3 内存出错的gdb调试 四 安装opencv 3 4 11 下载opencv 3 4 12 解压3 编译4 配