嵌入式程序调试与opencv图像库

7 篇文章 0 订阅
5 篇文章 0 订阅

实验目的
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 检查是否有损坏的依赖

`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值