GDB调试器及使用方法入门+opencv的使用

GDB调试器及使用方法入门+opencv的使用

GDB的打开方式

程序要能被调试,必须包含调试信息
编译程序时,通过gcc的-g选项为程序添加调试信息,例如:

  • gcc –g –o helloworld helloworld.c
    在命令行窗口输入以下命令启动GDB:
  • gdb [程序名]
    在这里插入图片描述
    启动成功。

断点的使用

在GDB下我们可以使用断点来排除错误。以下我们使用一个例子来说明
本次使用的代码为:

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

使用命令l/list显示代码和行号

如图:

在这里插入图片描述
在这里插入图片描述
b 17为在17行设置断点,同理,b ShowRevertNum为通过函数名设置断点。
info b 为显示所有断点信息。
在这里插入图片描述

opencv的使用

一、ubuntu下opencv的安装

安装方法参考:安装方法

二、编写一个打开图片进行特效显示的程序

  • 1.在opencv安装目录下创建一个新文件夹并进入
    在这里插入图片描述
    进入后创建一个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("haha.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;
}
  • 2 .编译并运行
    使用语句编译
g++ test.cpp -o test `pkg-config --cflags --libs opencv`

以上编译命令中我们其实用到了一个工具“pkg-config
1.检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
2.获得编译预处理参数,如宏定义,头文件的位置。
3.获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
4.自动加入所依赖的其它库的设置

在这里插入图片描述
在这里插入图片描述
运行时会报错。原因是缺少一个需要的依赖包。使用以下命令加入依赖

sudo apt-get install libcanberra-gtk-module

在这里插入图片描述
重新编译并运行
在这里插入图片描述
注意:haha.jpg要和test.cpp放在同一文件夹下,否则图片无法加载
在这里插入图片描述

三、opencv库编写打开摄像头压缩视频的程序

  • 1.编写代码并编译
    在这里插入图片描述
    源代码:
#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();
	return 0;
}


  • 2.运行
    在这里插入图片描述

在这里插入图片描述
文件保存在opencv/mytest目录下。
在这里插入图片描述

总结

GDB还有着更多好用的调试方法,不过我都还没能掌握,尤其是core文件的使用。
opencv在刚上手的时候问题还很多,很多奇奇怪怪的问题,什么版本号不对,缺少依赖等等。使用多了就会发现这真的是个很强大的工具。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值