实验目的
1.在Ubuntu系统上练习程序代码的GDB调试
2.opencv图像编程
目录
一 . Ubuntu上的GDB
GDB : GNU Debugger,是GNU工程为GNU操作系统开发的调试器,但它的使用不局限于GNU操作系统, GDB可以运行在UNIX、Linux甚至Microsoft Windows。
1.gdb调试举例
创建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);
}
然后用gdb调试
gcc -o test3 -g gdb.c
gdb test3
程序输入输出
2.认识gdb命令
file装入想要调试的可执行文件。
kill 终止正在调试的程序。
list 列出产生执行文件的源代码的一部分。
next 执行一行源代码但不进入函数内部。
step 执行一行源代码而且进入函数内部。
run 执行当前被调试的程序。
c 继续运行程序。
quit 终止gdb。 • watch 使你能监视一个变量的值而不管它何时被改变。
backtrace 栈跟踪,查出代码被谁调用。
print 查看变量的值。
make 使你能不退出gdb就可以重新产生可执行文件。
shell 使你能不离开gdb就执行UNIX shell命令。
whatis 显示变量或函数类型。
break 在代码里设断点,这将使程序执行到这里时被 挂起。
info break显示当前断点清单,包括到达断点处的次数等。
info files 显示被调试文件的详细信息。
info func显示所有的函数名称。
info local 显示当函数中的局部变量信息。
info prog 显示被调试程序的执行状态。
delete [n] 删除第n个断点。
disable[n] 关闭第n个断点。
enable[n] 开启第n个断点。
ptype显示结构定义。
set variable 设置变量的值。
call name(args)调用并执行名为name,参数为args的函数。
Finish 终止当前函数并输出返回值。
eturn value停止当前函数并返回value给调用者。
二 .opencv的操作
1.opencv的安装
在官网进行下载opencv,然后将下载好的文件夹移动到home里(我这里下的是opencv-3.4.1)
2.opencv打开照片的操作
(1)读入
如果你的home里是.zip文件,那么你需要输入unzip opencv-3.4.1.zip 进行解压
(2) 安装和配置
安装依赖库和cmake
sudo apt-get install cmake
安装之后执行命令 ,创建编译文件夹
mkdir my_build_dir
进入文件夹进行配置
cd my_build_dir
cmake一下
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
可能某些同学在这里无法cmake,我开始也遇到这个问题。你之前应该漏掉了一些依赖库 , 需要sudo apt-get install build-essential
执行命令,漫长的编译过程
sudo make
执行命令
sudo make install
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
至此所有配置完成
(3) Linux下编程
新建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;
}
保存并编译
gcc test.cpp -o test `pkg-config --cflags --libs opencv`
运行
./test
3.opencv上打开摄像头操作
(1)编程
创建test1.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;
}
(2)连接
ubuntu右下角
虚拟机->设置->USB控制器
如果是USB1.0就选择2.0,2.0的话就选3.0
(3)运行
g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv` //创建可执行文件
./test1 //执行文件
4.opencv打开视频操作
(1)准备工作
(博主在做视频操作时,在后面因为某些库没安装浪费了很长时间,所以我们先做一些准备工作)
先要检查你的ffmpeg是否就位
cmake-gui
如果你该处你NO,那么我们就此进行ffmpeg安装工作
//安装相关工具
sudo apt-get install -y nasm yasm cmake gcc
//下载&安装
wget https://ffmpeg.org/releases/ffmpeg-4.1.3.tar.bz2
tar jxf ffmpeg-4.1.3.tar.bz2
cd ffmpeg-4.1.3
//编译,这里因为要用到ffmpeg的动态库所以加上 --enable-shared
./configure --enable-shared --prefix=/usr/local
make
make install
编辑 profile 文件(sudo vim /etc/profile)在文件末尾添加:
export FFMPEG_HOME=/usr/local/ffmpeg export
PATH=$FFMPEG_HOME/bin:$PATH
编辑 ld.so.conf 文件 (sudo vim /etc/ld.so.conf) 在末尾添加:
/usr/local/ffmpeg/lib
回到 opencv的 build目录中,重新再 make 一下
cd ~/opencv3.4.3/my_build_dir/
rm -rf *
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make -j4
sudo make install
(2)编程
创建test2.cpp文件
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture capture;
Mat frame;
VideoCapture cap("ps.mp4");
if(!capture.isOpened())
{
printf("can not open ...\n");
return -1;
}
namedWindow("output", CV_WINDOW_AUTOSIZE);
while (capture.read(frame))
{
imshow("output", frame);
waitKey(10);
}
capture.release();
return 0;
}
(3)运行
g++ test2.cpp -o test2
pkg-config --cflags --libs opencv
./test2
如果你遇到下面的错误
此时我重新通过查阅换了一组打开视频操作的代码
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture cap("ps.mp4");
if (!cap.isOpened())
{
return -1;
}
Mat frame;
while (1)
{
cap >> frame;
if (frame.empty()) break;
imshow("当前视频", frame);
if (waitKey(30) >= 0)
break;
}
return 0;
}
同上编译运行
(该问题可能是兼容的问题,总之如果所有该配置的你都配置了,那就换汤不换药,多试试!)
(4)补充
如果大家检查显示在ffmpeg那里是YES,运行仍然显示
或者
那么可能是你的ffmpeg里面更深层的东西没有安装好,可以参考以下的博客进行细化的安装;
https://blog.csdn.net/Z_zzzD/article/details/106070491
https://blog.csdn.net/lingzhaoli/article/details/78711445
最后,在所有安装以后大家别忘了回去make哦!
三.Ubuntu的镜像源
一般下载各种包,我们使用国外的镜像源那么传输速度会很慢,有时候下载会耗费几十分钟甚至更久。如果我们是国内的镜像源,可能会提升传输速度,更加快捷。下面,我就以我的ubuntu18.04为例,教大家修改一下aliyun的镜像源。
进入到配置目录
cd /etc/apt
备份源
cp sources.list sources.list.d
编辑源
sudo nano sources.list
用阿里源替换(当然你也可以使用清华源的等)
#添加阿里源
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
清华源和阿里云的源是国内特别好用的两个源
清华源
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
最后给大家奉上一些apt更新命令的解
sudo apt-get update 更新源
sudo apt-get install package 安装包
sudo apt-get remove package 删除包
sudo apt-cache search package 搜索软件包
sudo apt-cache show package 获取包的相关信息,如说明、大小、版本等
sudo apt-get install package --reinstall 重新安装包
sudo apt-get -f install 修复安装
sudo apt-get remove package --purge 删除包,包括配置文件等
sudo apt-get build-dep package 安装相关的编译环境
sudo apt-get upgrade 更新已安装的包
sudo apt-get dist-upgrade 升级系统
sudo apt-cache depends package 了解使用该包依赖那些包
sudo apt-cache rdepends package 查看该包被哪些包依赖
sudo apt-get source package 下载该包的源代码
sudo apt-get clean && sudo apt-get autoclean 清理无用的包
sudo apt-get check 检查是否有损坏的依赖
`