一、GDB调试
1、GDB是什么?
- GDB简介
GDB : GNU Debugger,是GNU工程为GNU操作系统开发的
调试器,但它的使用不局限于GNU操作系统, GDB可以运行
在UNIX、Linux甚至Microsoft Windows。
GDB可以调试C、C++、Objective-C、Pascal、Ada等语言编
写的程序;被调试的程序可以跟GDB运行于同一台电脑,也可
运行于不同电脑。
使用GDB我们可以:
– 设置断点使程序停住
– 监视或修改程序中变量的值
– 跟踪代码执行过程
- GDB的使用
- 程序要能被调试,必须包含调试信息
- 编译程序时,通过gcc的-g选项为程序添加调试信息,例如:
gcc –g –o helloworld helloworld.c
- GDB常用命令
Column 1 | Column 2 |
---|---|
- file | 装入想要调试的可执行文件。 |
-kill | 终止正在调试的程序。 |
-list | 列出产生执行文件的源代码的一部分 |
-next | 执行一行源代码但不进入函数内部 |
-step | 执行一行源代码而且进入函数内部 |
-run | 执行当前被调试的程序 |
-c | 继续运行程序 |
-quit | 终止gdb |
-watch | 使你能监视一个变量的值而不管它何时被改变 |
… | … |
2、使用GDB调试程序
利用core文件定位以下出错代码
#include<stdio.h>
int main(void)
{
int *p=0;
*p=1;
return 0;
}
在命令行中输入命令:
ulimit -c 100
//100为文件容量;
gcc -o rom -g rom.c
//编译rom文件;
./rom
//执行rom文件;
如图:
然后输入
gdb rom core
可以知道问题所在。
二、Opencv
“学了opencv,妈妈再不担忧你不会图像编程啦!”
1、OpenCV的安装:
1、首先在官网上下载OpenCV的安装包
2、然后将安装包复制到ubuntu系统下的目录中(这个操作需要VMware Tool,安装了才可以Windows系统和ubuntu进行交互)进行解压:
unzip opencv-3.4.1.zip
进入到解压后的文件包中
cd opencv-3.4.1
安装依赖库和cmake
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
//安装依赖库;
sudo apt-get install cmake
//安装cmake;
安装完cmake之后执行命令 ,创建编译文件夹
mkdir my_build_dir
//创建文件夹;
cd my_build_dir
//进入文件夹;
然后Cmake一下:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
然后进行下行命令
sudo make
此时如果兄弟们出现了如下所示错误,不要着急:
然后输入以下命令:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
继续从安装依赖库和cmake那一步重新开始,就可以了。
然后会有以下的结果:(结束时间有点久,大约20多分钟)
最终结果是:
还没完,继续执行命令:
sudo make install
执行完毕后OpenCV编译过程就结束了,接下来就需要配置一些OpenCV的编译环境
先将OpenCV的库添加到路径,从而可以让系统找到
sudo gedit /etc/ld.so.conf.d/opencv.conf
执行此命令后打开的可能是一个空白的文件,不用管,只需要在文件末尾添加
/usr/local/lib
保存回到命令行界面;
执行如下命令使得刚才的配置路径生效
sudo ldconfig
然后配置bash
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
这样所有配置就完成了。
2、Linux下编程特效图片代码
在opencv-3.4.1下新建文件夹mytest
cd ..
mkdir mytest
然后在该目录下创建test.cpp
touch test.cpp
vim test.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;
}
保存后进行编译,会生成test可执行文件:
g++ test.cpp -o test `pkg-config --cflags --libs opencv`
//需要用g++,用gcc会报错;
然后在输入“ .test ”就可以看到结果了,然后Ctrl + C退出。
可以与原图做一下比较:
思考:
注意gcc编译命令: gcc test1.cpp -o test1 pkg-config --cflags --libs opencv
请解释这条编译命令,它是如何获得opencv头文件、链接lib库文件的路径的?
3、用opencv库编写打开摄像头压缩视频
首先在当前目录中建立一个“camera.cpp ”源文件:
vim camera.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;
}
保存好以后进行编译,在执行:
g++ camera.cpp -o camera `pkg-config --cflags --libs opencv`
./out
会出现报错:
那先进行主机的设置:断开虚拟机上的右下角的圆形标志的连接。
如果还是不能解决问题,那就修改一下系统的USB参数:
把usb2.0 换成usb3.0,或者相反操作,重启虚拟机,如此,反复若干次,就可以了。
录制视频
在当前文件夹中建立一个“ my test .cpp"源文件:
/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/
#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
void 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();
}
然后进行编译:
g++ mytest.cpp -o mytest `pkg-config --cflags --libs opencv`
然后可以在当前文件中出现“ mytest”可执行文件,
然后输入“./test”,就会出现录制镜头;
在当前文件中也生成了RecordVedio
总结
本次上机通过对用各种命令来进行属实熟练了不少,也渐渐地感觉到用命令进行操作很方便简洁,其次对于OpenCV的安装和使用,又学习了解到了新的东西,可以通过命令来进行图片的特效,通过命令可以打开摄像头进行录像并进行播放。对于ubuntu系统的兴趣增加了很多,对于学习新的东西有了动力;再就是整个过程做下来遇到了很多的问题,怎么安装问题,命令错误出在哪里等,总的来说,通过老师同学的辛勤指导完整了本次的上机,学到了不少的知识。