目录
一、GDB
调试基础信息
GDB
的作用:
- 设置断点使程序停住
- 监视或修改程序中变量的值
- 跟踪代码执行过程
命令 | 说明 |
---|---|
l |
显示代码行数 |
b(break) |
设置断点 |
run |
执行程序 |
c |
继续执行 |
n |
单步执行 |
whatis |
变量数据类型查看 |
quit |
终止gdb调试 |
print |
查看变量的值 |
注意:通过 gcc 编译程序时,需加上 -g 选项 (为程序添加调试信息)。
二、使用GDB
调试
1.创建文件夹并建立子程序gdb.c
- gdb.c的代码:
#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);
}
程序说明:实现一个整型数的反转功能,如输入1234,返回4321。
2.使用gdb
调试
gcc -o testgdb -g gdb.c
gdb testgdb
3.尝试运行程序
4.通过gdb
调试,跟踪输入样例为 100时,程序的运行轨迹
5.修改程序并运行
-
将
“while (iNum > 10)”
修改为“while (iNum >= 10)”
-
运行结果
三、OpenCV
在Ubuntu
下的图像编程
1.Ubuntu
下安装opencv
具体安装细节请参考:【嵌入式】Windows10&Ubantu16.04&树莓派3B+安装opencv教程.
安装时依赖库一定要安装全,不然之后出错很麻烦
2.使用opencv打开一张图片
1)在mytest中创建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;
}
3)保存编译
gcc编译器:gcc +文件名+ -o+输出文件流名称 +` 支持包
gcc test.cpp -o test `pkg-config --cflags --libs opencv`
- 此时发现如果用 "gcc test1.cpp -o test1
pkg-config --cflags --libs opencv
"编译会报如下错误,因为 gcc 主要是编译 C程序的,此时应用 g++;如果用 g++ 编译 C程序,它会直接调用 gcc 去编译
g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv`
4)运行及结果
./test
四、使用opencv打开摄像头
1.检查虚拟机是否连接摄像头
若图中红框中图标没有绿则虚拟机未连接摄像头
-
若没有,点击 “虚拟机 → 设置 →USB 控制器 → 选择 USB3.0”,设置虚拟机。
-
然后点击“虚拟机→可移动设备→Cheng Uei···→连接”
2.在mytest下创建test2.cpp
- 代码:
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
//从摄像头读取视频
VideoCapture capture(0);
//循环显示每一帧
while (1)
{
Mat frame;//定义一个Mat变量,用于存储每一帧的图像
capture >> frame;//读取当前帧
imshow("读取视频帧", frame);//显示当前帧
//waitKey(30);//延时30ms
if(waitKey(30)==27) //按esc键退出
{
break;
}
}
system("pause");
return 0;
}
- 编译运行
g++ test2.cpp -o test2 `pkg-config --cflags --libs opencv`
./test2
五、使用opencv打开一个视频文件
1.新建一个 test3.cpp 文件
- 代码(把 test2.cpp 中 capture() 中的0换成视频文件的字符串地址):
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
//从摄像头读取视频
VideoCapture capture("/home/yunkaichu/opencv-3.4.1/mytest/11.mp4");
//循环显示每一帧
while (1)
{
Mat frame;//定义一个Mat变量,用于存储每一帧的图像
capture >> frame;//读取当前帧
imshow("读取视频帧", frame);//显示当前帧
waitKey(30);//延时30ms
}
system("pause");
return 0;
}
2.编译运行
g++ test3.cpp -o test3 `pkg-config --cflags --libs opencv`
./test3
- 倘若编译出错,参考:
OpenCV在Ubuntu下的图像编程.
六、通过摄像头采集图像并压缩成视频
1.在mytest下创建test4.cpp
- 代码
/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频 video.mp4
*********************************************************************/
#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("video.mp4", 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.编译运行
g++ test4.cpp -o test4 `pkg-config --cflags --libs opencv`
./test4
七、总结
初步学习了如何在ubuntu下使用GDB调试和opencv,其中最麻烦的就是配置环境,在下载依赖库以及ffmpeg时花费了太多环境。