GDB以及Opencv的使用

目的

一. 在Ubuntu系统上练习程序代码的GDB调试。参照课件示例。

二. “学了opencv,妈妈再不担忧你不会图像编程啦!”。

在Ubuntu16/18系统下练习编译、安装著名的C/C++图像处理开源软件库 Opencv3.x 。安装成功后:
  1. 编写一个打开图片进行特效显示的代码 test1.cpp(可参考学姐博客);

注意gcc编译命令: gcc test1.cpp -o test1 pkg-config --cflags --libs opencv

请解释这条编译命令,它是如何获得opencv头文件、链接lib库文件的路径的?

  1. 练习使用opencv库编写打开摄像头压缩视频的程序。参考示例代码1和示例代码2。并回答:

1)如果要求打开你硬盘上一个视频文件来播放,请问示例代码1第7行代码如何修改?

2)在示例代码1第9行的while循环中,Mat是一个什么数据结构? 为什么一定要加一句waitKey延时代码,删除它行不行?

3)示例代码1代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要用键盘Ctrl+C 强制中断程序,非常不友好。如何改进?

gdb的使用

gdb相关命令:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

首先我们编写测试代码:

#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);
}
//程序功能:将输入的数的每一位进行倒置然后输出。

加下来先用gcc将.c文件编译成可执行文件,然后使用gdb调试并显示出代码:
在这里插入图片描述
经测试发现,当我们输入100时,程序并没有按照我们的期望输出001,而是输出了010:
在这里插入图片描述
通过两种方式设置断点,并查看断点:
在这里插入图片描述
在这里插入图片描述
经过调试,我们发现问题出在第4行,在第二次循环时inum=10,不满足while(inum>10)的条件,所以跳出,我们对这行代码进行修改:
将inum>10修改为inum>=10
再次编译程序,可以正常运行:
在这里插入图片描述

OpenCV在Ubuntu下的图像编程:

首先我们要在Ubuntu上安装OpenCV,我下载的是OpenCV3.4.1.
官网下载地址:https://opencv.org/opencv-3-4-1/
下载时可能下载速度过慢导致失败,这是因为虚拟机系统默认的下载源是国外的,我们可以通过修改
/tec/apt中的sources.list文件,将源换成国内的。详情参考:https://blog.csdn.net/weixin_44575660/article/details/105999772

接下来编写一个打开图片进行特效显示的代码 test1.cpp:

#include <highgui.hpp>
#include <opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
	CvPoint center;
	double scale = -3;
	IplImage* image = cvLoadImage("d://myworkspace//VisualStudioProjects//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;
}

}

对比结果如图:
在这里插入图片描述
在这里插入图片描述

使用使用opencv打开摄像头

相关代码:

#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;
}

步骤:
由于我使用的是比较老的VirtualBox,而不是VM,所以不能直接从usb中找到摄像头,所以我先去下载了VirtualBox Extension Pack
接着在设备中选择摄像头
在这里插入图片描述
之后编译程序:
在这里插入图片描述

参考文章:

Windows10&Ubantu16.04&树莓派3B+安装opencv教程
VirtualBox 调用摄像头

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页