程序调试与opencv图像库

一、GDB调试

1.GDB常用命令

  • file 装入想要调试的可执行文件。
  • kill 终止正在调试的程序。
  • next 执行一行源代码但不进入函数内部。
  • list 列出产生执行文件的源代码的一部分。
  • step 执行一行源代码而且进入函数内部。
  • break 在代码里设断点,这将使程序执行到这里时被挂起。
    1.根据行号设置断点:(gdb) break linenum
    2.根据函数名设置断点: (gdb) break funcname
  • print 查看变量的值。
  • make 使你能不退出gdb就可以重新产生可执行文件。
  • shell 使你能不离开gdb就执行UNIX shell命令。
  • Finish 终止当前函数并输出返回值。
  • ctrl+c:退出输入
    2.GDB调试
    首先创建一个xu.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);
}

接着用gcc进行编译,并用GDB打开调试界面

在这里插入图片描述

在这里插入图片描述
输入l显示行数
在这里插入图片描述
输入b设置断点,这个要通过行数与代码
在这里插入图片描述
调试输入run在这里插入图片描述
查看iNum在这里插入图片描述

二、安装opencv并编写运行处理图片和视频

1.安装OPENCV3.4.1并安装过程很复杂,大家可以去看一下大佬的操作,写的贼详细。opencv3.4.1安装
2.编写一个打开图片进行特效显示的代码并进行编译
首先,在安装的opencv文件夹里面创建一个子文件夹mytest。
接着用vim编写text.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;
}

将text.cpp手动移动到mytest里,并将一幅图片下载好放到此文件夹里,将这幅图的名字改为text.jpg。

并用g++进行编译
程序如下:

 g++ text.cpp -o text `pkg-config --cflags --libs opencv`

在这里插入图片描述
最后就会看到mytest文件夹里边多出一幅特效图了,名字为text.png。
在这里插入图片描述
3.编写一个打开摄像头的显示处理视频的代码
过程和上边处理图片的过程类似,都是先编写一个.cpp源程序进行编译。
我们创建shexiang.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;
}

接着将此程序放到我们之前创建的mytest文件夹中
然后在mytest文件夹中打开终端,使用gcc进行编译
代码如下

g++ shexiang.cpp -o shexaing`pkg-config --cflags --libs opencv`

之后使用./shexiang命令就可以打开摄像头并显示处理视频了
在这里插入图片描述
在此之前也要做好一些准备,比如说将USB设置为3.0的,比如说将USB与linux打开连接之类的。

三、问题

1.如果要求打开你硬盘上一个视频文件来播放,请问示例一如何更改?
:VideoCapture capture(0)将此行里的括号里的0改为“路径+视频名”。

2.在实例一中while循环,Mat是一个什么数据结构?为什么一定要加一句waitKey延时代码,删除他行不行?
:Mat由两部分组成,一部分是头部,其大小为一个常量,通常表示为存储方式及图像大小等信息。还有一部分是数据块,表示为图像像素的值。
不能删除

3.示例代码一中会在whikle循环一直运行下去,你如果尝试用鼠标关闭图像显示窗口,会发现始终关不掉,需要用键盘Ctrl+C强制中断程序,非常不友好,如何改进?
:可以添加一个可以停止程序的代码,break,可以设置输一个字符,就直接break弹出程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值