GDB调试及opencv练习

本文介绍了GDB调试器的使用,包括设置断点、监视变量和跟踪代码执行。同时,详细讲解了OpenCV的安装、图片特效显示的代码编写,并提供了解决编译问题的方法。还探讨了使用OpenCV打开摄像头压缩视频的程序,分析了Mat数据结构、waitKey的作用以及如何优化程序以避免强制中断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GDB调试器及调试方法

1、GDB的作用

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

2、GDB的使用

gdb常用命令

  • file 装入想要调试的可执行代码
  • kill 终止正在调试的程序
  • list 列出产生执行文件的源代码的一部分
  • run 执行当前被调试的程序
  • c 继续运行程序
  • qiut 终止gdb(退出gdb)
  • break(b) 在代码里设断点,使程序执行到这里时被挂起
  • Finish 终止当前函数并输出返回值
    1、首先创建一个c源文件文件

在这里插入图片描述:2、编译程序时,通过gcc的-个选项为程序添加调试信息。

gcc -g -o 123 123.c

在这里插入图片描述
此时使用命令‘l’,可以查看源文件代码及其行号。
在这里插入图片描述使用break(b) 行号可以在固定处设置断点
在这里插入图片描述使用’run’执行程序
在这里插入图片描述键入‘c’继续执行
在这里插入图片描述

opencv的基本练习

1、下载并安装Opencv

1、在官网上下载opencv,本人选择的是opencv-3.4.1,可以根据自己需求选择不同版本。ubuntu环境下载opencv可能速度有点慢,可以在windows环境下下载,再复制到ubuntu中。
下载链接
安装教程:参考自weixin_45419375

2、编写一个打开图片进行特效显示的代码 test1.cpp

1、在opencv-3.4.1下新建一个文件夹mytest
在这里插入图片描述2、在当前文件夹中创建一个文件

vim test.cpp

源代码

#include<opencv2.hightgui.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("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;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;
}

3、接着将test.cpp编译生成可执行文件

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

若出现以下问题
在这里插入图片描述可以将gcc该为g++。

4、下载一张图片,将其位置放置到当前文件夹下(opencv-3.4.1/mytest),执行命令‘./test’
注意将图片名称改为 lena.jpg 因为源代码的命名为lena.jpg

./test

在这里插入图片描述在这里插入图片描述

练习使用opencv库编写打开摄像头压缩视频的程序

1、编写一个打开摄像头显示处理视频的程序代码。

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
//从摄像头读取视频
VideoCapture capture(0);
//循环显示每一顿
while (1)
{
	Mat frame;//定义一个Mat变量,用于存储每一帧桢的图像			
	capture >> frame;//读取当前帧
	imshow("读取视频桢",frame);//显示当前帧
	waitKey(30);//延时30ms
}
system( "pause");
return 0;
}

2、将test1.cpp(源代码名称)编译为可执行文件test1

g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv`

运行命令

./test1

在这里插入图片描述如1、果要求打开你硬盘上一个视频文件来播放,请问第6行代码如何修改?
将括号里的0改为—>“路径+视频名”(如“Downloads/1111.avi”)
头部:存储方式、图像大小等信息,头部的大小是一个常量(constant)
数据块:图像像素的值(按行顺序存储)
2、在第9行的while循环中,Mat是一个什么数据结构? 为什么一定要加一句waitKey延时代码,删除它行不行?
Mat是一个类,由两部分数据组成:矩阵头和一个指向所有像素值的矩阵的指针。如果不加waitKey的话,视屏不能显示,会消失,不能删除。
3、此代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要用键盘Ctrl+C 强制中断程序,非常不友好。如何改进?
在system( “pause”);后添加此代码

if(frame.empty())
{
break;
}

调节摄像头:
在这里插入图片描述或者
在这里插入图片描述调用命令‘cheese’启用摄像头

cheese

可以通过命令

lsusb

查看摄像头是否存在虚拟机中
在这里插入图片描述
在这里插入图片描述
如果调用的摄像头不能启动,可以尝试将USB2.0换为USB3.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值