一.GDB调试
1.查看是否安装了gdb
输入以下代码来查看是否安装了gdb
gdb -v
如果显示以下代码说明安装了,出现其它就是没有安装。可以上网搜寻gdb安装教程。
2.gdb的使用
先做准备工作,创建目录,创建.c文件,程序如下;
mkdir ts
cd ts
touch ts1.c
编辑.c文件
gedit ts1.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);
}
以上就是准备工作,下面开始使用gdb进行调试。
先使用gcc对其进行编译,这里因为需要进行gdb调试,所以多加了个-g。如下
gcc -o ts1 -g ts1.c
开始调试
gdb ts1
显示代码及其行号,
调试举例
a.通过行号和函数名设置断点;
b.查看所有断点信息;
c.执行程序
d.查看iNum类型
e.继续执行
f.打印iNum的值
退出gdb 只需要输入q然后enter就可以了。
大概操作就是这样,想详细了解其它命令的话可上网查找。
二.ubuntu下安装opencv-3.4.1及其编译
1.安装
1.1 先下载其压缩包。
1.2 将压缩包放到home目录底下,进行解压配置
打开终端模式,进行解压:
unzip opencv-3.4.1.zip
进入解压后的文件包中
cd opencv-3.4.1
-virtual-machine:~/opencv-3.4.1$
接下来安装依赖库和cmake。
权限不够的话先输入sudo su进入root权限再执行以下命令。
sudo apt-get install cmake
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
安装完成之后,创建文件夹,进行配置
mkdir my_build_dir
cd my_build_dir
-virtual-machine:~/opencv-3.4.1/my_build_dir$
cmake一下
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
执行命令
sudo make
这里推荐多线程会比较快
sudo make -j4
完成之后执行以下命令
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
1.3 进行编程
在opencv-3.4.1下新建目录,创建test.cpp
mkdir mytest
touch test.cpp
用gedit编辑器进行编程
sudo gedit 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;
}
g++编译
g++ test.cpp -o test `pkg-config --cflags --libs opencv`
这里的pkg-config就是一个用于获取库/模块的所有编译相关信息的命令,所以,这里的获取opencv头文件和链接lib库是因为这个命令的原因。pkg-config是从所有路径下的.pc文件获取信息。
编译成功后,执行*
./test
注意:图片需要自己下载然后存在test.cpp同一目录下!!!
结果如图所示:
2. opencv的运用
进入opencv-3.4.1中
cd opencv-3.4.1
创建目录(这里直接用前面创建的目录),创建test2.cpp文件,输入下面代码
cd mytest
touch test2.cpp
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;
}
用g++进行编译
g++ test2.cpp -o test2 `pkg-config --cflags --libs opencv`
执行
./test2
结果如图:
可以看到成功打开了摄像头,关闭摄像头请按Ctrl+c。
2.1 对于test2.cpp中程序的问题的一些解答
1.如果要打开一个硬盘上的视频文件来播放,可以修改程序中语句
VideoCapture capture("name.mp4")
2.程序中Mat是一个类,可以分为两个部分矩阵头和指向像素数据的矩阵指针。waitkey是每一帧的显示时间,要是没有延时,就会弹出窗口一闪而过。
3.改善Ctrl+c关闭摄像头的方式,在里面加代码如下,就可以直接按esc关闭摄像头。
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture capture(0);
while(1)
{
Mat frame;
capture >> frame;
imshow("读取视频帧",frame);
if(frme.empt())
{break;}
waitKey(30);
}
system("pause");
return 0;
}
摄像头问题
在这之前需要安装vmware-tools组件,不然找不到摄像头。
如果发现打不开摄像头,先去Windows用Win+r打开命令行输入services.msc,在里面找到VMware USB Arbitration Service双击,然后点击启动。
然后回到虚拟机
打开虚拟机
在里面查看就可以看到摄像头了Acer…,点击它然后点击连接
虚拟机桌面右下角那个圆圈图案亮了就说明摄像头连接好了。
然后输入命令查看摄像头驱动安装,
ls /dev ideo*
然后安装摄像头采集软件
sudo apt-get install cheese
完成安装后执行
cheese
就可以打开摄像头。
如果发现摄像头黑屏,可以打开最底下的设置,在里面看到USB点击它切换版本,2.0换3.0 3.0换2.0.。如果还不行,求助百度。
总结
在安装opencv的过程中还是出现了许多问题,比如在编辑其test.cpp文件时,因为多加了/导致test.cpp里无程序。后面编译的时候因为用gcc编译而出现问题,后来问老师然后用g++编译成功了,还有自己的虚拟机无摄像头,后来上网查找原因之后解决了问题,方法写在文章里。总的来说,这次收获很多,对于Linux的命令掌握更加熟练,希望以后还能保持。