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