一、程序代码的GDB调试
一般来说GDB主要有三大功能:
1、启动被调试函数
2、让被调试的程序在指定位置停止
3、当程序停住时,检查它的状态值
GDB的使用:
随便写一个程序:
用gcc编译c文件,再进入gdb调试模式
输入l,显示代码及行号
输入list继续显示余下代码
通过行号设置断点
通过函数名设置断点
用info b 命令查看所有断点信息
用run命令执行程序
用whatis命令查看n的类型
再用print打印n的值
用c命令继续执行程序
打印此时的n值
再用s命令进行单步调试
二、opencv的安装与使用
一、opencv3.4.1的安装
1、安装需要的包
(1)、sudo apt-get install build-essential
(2)、sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
(3)、sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff5-dev libdc1394-22-dev # 处理图像所需的包
(4)、sudo apt install python3-dev python3-numpy # python支持
(5)、sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
(6)、sudo apt-get install libxvidcore-dev libx264-dev # 处理视频所需的包
(7)、sudo apt-get install libatlas-base-dev gfortran # 优化opencv功能
(8)、sudo apt-get install ffmpeg
2、下载opencv-3.4.1.zip,再进行解压
官网(https://opencv.org/)
命令:unzip opencv-3.4.1.zip解压
3、安装opencv:打开解压后opencv3.4.1文件夹,打开终端输入mkdir build创建build文件夹,再cd build
(1)cd opencv-3.4.1
(2)mkdir build
(3)cd build
(4)cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local …
(5)sudo make -j6 j6:的意思是用4个核执行编译(查看CPU核心数:nproc
) 此处较慢需要耐心等待,大概十来分钟
(6)sudo make install (需要管理员权限)
4、环境配置
sudo /bin/bash -c ‘echo “/usr/local/lib” > /etc/ld.so.conf.d/opencv.conf’
5、更新系统库
6、配置bash
在末尾添加:PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
保存退出。
7、执行下命令使配置生效
sudo source /etc/bash.bashrc
//激活配置然后更新database
sudo updatedb
如遇到下面问题:
解决方法:
8、所有配置完成,测试
cd到opencv-3.4.1/samples/cpp/example_cmake目录下,按顺序执行
(1)cmake .
(2)make
(3)./opencv_example
演示结果:
二、opencv3.4.1的使用
图片处理:
1、在opencv3.4.1文件夹里面建立xltest文件夹
2、进入xltest文件夹打开终端,创建调试程序test1.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;
}
再用gcc编译:
3、测试(图片要复制到xltest文件夹里面名字改为lena.jpg)
进入xltest文件夹里面打开终端输入./test1
opencv打开摄像头处理视频:
1、创建test2.cpp文件(vim test2.cpp),敲入代码:
#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;
}
2、编译test2.cpp文件
3、打开摄像头
4、摄像头成功拍摄照片
问题:
1)如果要求打开你硬盘上一个视频文件来播放,请问示例代码1第7行代码如何修改?
答:把括号里面改为要播放的文件名加引导。
2)在示例代码1第9行的while循环中,Mat是一个什么数据结构? 为什么一定要加一句waitKey延时代码,删除它行不行?
答:不行,可能需要缓冲时间吧。定义一个Mat变量,用于存储每一帧的图像。
3)示例代码1代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要用键盘Ctrl+C 强制中断程序,非常不友好。如何改进?
答:我觉得可以加一个break代码。