嵌入式系统基础学习笔记(四)

2023-05-16

目录

  • 一、GDB调试简例
    • 1.1 例1
    • 1.2 例2
  • 二、OpenCV入门
    • 2.1 在Windows下使用OpenCV-3.4.8
      • 2.1.1 OpenCV的安装与配置
      • 2.1.2 一个简单的OpenCV对图片特效显示例子
    • 2.2 在Ubuntu18.04下使用OpenCV-3.4.8
      • 2.2.1 OpenCV的安装与配置
      • 2.2.2 一个简单的OpenCV对图片特效显示例子
      • 2.2.3 用OpenCV调用摄像头录制视频
    • 2.3在树莓派下下使用OpenCV-3.4.8

作业要求:
1、在Ubuntu18.04下使用GDB调试一个简单的程序
2、学习在Windows、Ubuntu、树莓派下使用OpenCV对图片特效显示,利用OpenCV库编写打开摄像头、拍摄视频

一、GDB调试简例

1.1 例1

新建一个 gbdtest.c 文件,并通过gcc指令生成gbdtest文件,gbdtest.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 -o gdbtest -g gdbtest.c

tips:万万不可少加 -g 否则无法调试

接下来利用gdb调试该程序,图片很清晰,就不贴出指令段了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 例2

新建一个 duantest.c 文件,进行段错误调试,源代码如下

在这里插入图片描述

#include <stdio.h>
#include <string.h>

#define BUFSIZE 256

static char acBuf[BUFSIZE];
static char *pStr;
int main(void)
{
	printf("please input a str:");
	gets(pStr);
	printf("\nU str is:%s\n", pStr);
}

如同例1,对duantest.c文件进行编译

在这里插入图片描述
直接执行后,可看到系统报错 “段错误 (核心已转储)”,接下来就开始进入gdb调试

在这里插入图片描述

二、OpenCV入门

2.1 在Windows下使用OpenCV-3.4.8

2.1.1 OpenCV的安装与配置

在 OpenCV 的官网获取 Windows版 和 Sources版 (之后在Ubuntu系统中要使用Sources版)
在这里插入图片描述
在这里插入图片描述下载好 Windows版 后,直接运行安装程序
在这里插入图片描述tips:安装完成后,需要配置系统环境变量:在path中添加以下路径:“X:\…\opencv3XX\opencv\build\x64\vc15\bin”

在VS中新建一个Visual C++空项目,这个项目就用来编写我们第一个OpenCV程序,但我们首先要配置它的环境。
在这里插入图片描述
在工程文件中新建一个 test.cpp 项
在这里插入图片描述
顺便把Debug类型调为x64

在这里插入图片描述
在 “属性管理器–>配置属性” 中修改 “包含目录” , “库目录” , “连接器/输入/添加依赖项”
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这些路径都存在于OpenCV的安装路径下,修改好之后,就算是将工作环境搭建好了。

2.1.2 一个简单的OpenCV对图片特效显示例子

现在借鉴一个例子,目的是将照片灰度改变并显示,并自动保存改变灰度后的图片到项目工程文件夹中。
代码如下:

#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://Code//testResourses//testimg.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;
}

在这里插入图片描述
编译运行

在这里插入图片描述
程序成功运行,并保存了改变灰度后的图片

在这里插入图片描述

2.2 在Ubuntu18.04下使用OpenCV-3.4.8

2.2.1 OpenCV的安装与配置

将之前下载好的 OpenCV Sources版 的压缩文件拷贝到Ubuntu系统下

在这里插入图片描述
在终端里键入以下命令解压缩 OpenCV文件夹

unzip opencv-3.4.8sourcestype.zip

在这里插入图片描述进入解压好的文件夹中,再创建一个编译文件夹,进入文件夹开始配置

mkdir build_dir
cd build_dir

执行 cMake 指令

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local …

在这里插入图片描述
执行make指令,等待编译完成

sudo make

tips:这一步可以写成 “sudo make -j4” 意为使用四线程进行编译,速度会很快

在这里插入图片描述
等待make编译完成后键入命令

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

在这里插入图片描述
tips:这一步很可以出现 “找不到命令 updatedb” 的错误,但是实测对之后的运行过程并无影响,最好还是参考
ubuntu命令updatedb报错: command not found解决方案
将错误解决

至此,环境配置结束,环境配置过程中可能出现许多问题,我给大家分享一些参考资料:
1.在 Ubuntu系统下安装 OpenCV 全过程
2.【嵌入式】Windows10&Ubantu16.04&树莓派3B+安装opencv教程
3.Linux配置OpenCV遇到的头文件路径的问题
4.ubuntu18.04 安装OpenCV3.4.1踩坑过程

2.2.2 一个简单的OpenCV对图片特效显示例子

紧接上一个过程,接下来用一个如同 2.1.2 的例子测试OpenCV

在 opencv-3.4.8 下新建文件夹 /test ,在 /test 文件夹下新建一个 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("testimg.jpg");
	//CV时不要忘记修改自己的图片名字
	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;
}

在这里插入图片描述
把图片放在 /home 目录下

mv testimg.jpg /home

在这里插入图片描述
接下来使用 gcc(g++) 编译即可成功得到test文件,直接运行 test 文件可成功得到结果

g++ test.cpp -o test pkg-config --cflags --libs opencv
./test

在这里插入图片描述

2.2.3 用OpenCV调用摄像头录制视频

首先用 Ubuntu 自带的 Cheess(茄子) 软件测试一下摄像头是否正常工作,若不是,请参考这里

在这里插入图片描述
借鉴 Ctrl C +V 一个开启摄像头并录制视频的例子,给它起名叫camtest.cpp

#include<stdio.h>
#include<math.h>
#include "highgui.h"
#include <cv.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
 
//#include <cvaux.h>
//#include <highgui\highgui_c.h>
//#include <core\types_c.h>
//#include <photo\photo_c.h>
//#include <imgproc\imgproc_c.h>
//#include <photo\photo
 
using namespace cv;
 
 
int main( int argc, char** argv )
{
	printf("I am start \n");
	VideoCapture cap(0); // open the default camera
	if(!cap.isOpened())  // check if we succeeded
		return -1;
 
	printf("%f, %f\n",cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
	cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
	cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
	cap.set(CV_CAP_PROP_FPS, 15);
	printf("%f, %f\n",cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
	Mat src_gray;
	cvNamedWindow( "video", CV_WINDOW_AUTOSIZE );
 
	while(1)
	{
		Mat frame;
		cvWaitKey(10);
		cap >> frame;
		imshow("video", frame);
	}
 
 
	return 0;
}

键入指令编译生成可执行文件 camtest ,运行它

gcc camtest.cpp -o camtest pkg-config --cflags --libs opencv
./camtest

在这里插入图片描述

在这里插入图片描述
成功运行。

2.3在树莓派下下使用OpenCV-3.4.8

由于没有在 树莓派3B+ 上安装截图的工具,我仅仅贴上了运行结果的照片,安装 OpenCV 和配置环境的过程都与 Ubuntu 相仿,编译程序过程也是按部就班,所以请参照2.2的部分

在这里插入图片描述之后会更新"从零开始的树莓派":把树莓派从无感情的电路板装配成掌上电脑的过程,敬请期待。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式系统基础学习笔记(四) 的相关文章

  • Java工具类:String与DateTime类型的相互转换

    1 String 转 DateTime 在转换之前需要引入 hutool 依赖 String datestr 61 34 2022 5 19 34 DateTime datetime 61 DateUtil parse datestr 2
  • Iterator迭代器的一般用法

    Iterator迭代器的一般用法 迭代器 xff08 Iterator xff09 迭代器是一种设计模式 xff0c 它是一个对象 xff0c 它可以遍历并选择序列中的对象 xff0c 而开发人员不需要了解该序列的底层结构 迭代器通常被称为
  • socket编程---fgets和fputs函数使用理解

    这一节是继续上一节socket05的讨论 xff0c 来探讨在使用socket进行通信中遇到的一些函数使用理解误区 1 fgets的使用注意点 在写socket通信 xff08 代码见上一篇中 xff0c 只是将sendbuf和recvbu
  • Tarjan算法详细讲解

    Tarjan算法讲解的博客网上找到三篇比较好的 现在都转载了 个人只研究了第一篇 正如博主所说 讲的标比较详细 清晰 剩下两篇也可以看一下 卿学姐视频讲解 https www bilibili com video av7330663 以下内
  • 中文乱码在线恢复网站

    乱码恢复
  • GCC自带的一些builtin内建函数

    title GCC自带的一些builtin内建函数 date 2021 02 27 18 57 00 description 一些GCC自带的内建 bulitin 函数的接口及实现 一 GCC内建函数 最近在刷 leetcode 的时候遇到
  • Shell脚本实用小技巧-教你屏蔽执行命令的所有显示信息,包含错误信息

    前言 xff1a 在Linux中 xff0c 有个 dev null的东西 xff0c 人们一般称之为黑洞 xff0c 大概的意思就是东西就像黑洞一样 xff0c 任何东西丢进去都会消失 xff0c 那么下面就开始进行一些小案例去认识一下这
  • MPU6050应用详解

    MPU6050应用详解 最近项目上要用到 MPU6050 陀螺仪 xff0c 以前没有接触过它 虽然在网上很容易就可以找到了需要的代码 实现了一部分功能 但是却还是对陀螺仪的工作原理不太了解 xff0c 它的代码也需要分析一下 xff0c
  • protobuf详解

    1 protobuf 简介 protobuf protocol buffer 是谷歌内部的混合语言数据标准 通过将结构化的数据进行序列化 串行化 xff0c 用于通讯协议 数据存储等领域和语言无关 平台无关 可扩展的序列化结构数据格式 我们
  • 白泽知识讲堂 | printf漏洞介绍

    引子 Hello各位小伙伴们 xff0c 白泽又和大家见面了 大家还记得自己写的第一个C语言程序吗 xff1f 那是我们和代码爱情的起点 xff0c 一眼万年 没错 xff0c 就是那个耳熟能详的Hello World 1 include
  • Linux生成core文件相关配置,core文件调试示例

    1 生成core文件系统配置 使用ulimit c命令可以查看当前系统对于core文件的配置 xff0c 0表示不生成core文件 xff1b 不为0的数字a表示限制core文件大小不超过a xff0c 单位是k xff1b unlimit
  • Ubuntu 手动配置DNS

    使用ping命令测试百度域名时发现 xff0c 无法解析这个域名 xff0c 说明当前系统上没有配置DNS服务器 配置DNS服务器的方式主要有以下两种 xff1a 目录 1 修改DNS配置文件 etc resolv conf 2 修改网卡配
  • STM32启动文件详解

    启动文件使用的 ARM 汇编指令汇总 启动程序源码注释 点此下载 1 Stack 栈 Stack Size EQU 0x00000400 AREA STACK NOINIT READWRITE ALIGN 61 3 Stack Mem SP
  • Motorola_MSB_LSB

    声明 xff1a 如果涉及侵权 xff0c 请联系本人删除侵权内容 声明 xff1a 本文由本人以以往工作经验为依据 xff0c 总结而得 xff0c 如果错误 xff0c 欢迎指正 xff0c 便于后人参考 xff0c 少走弯路 如果图片
  • 虚拟机怎么安装vmware tools

    这篇文章主要为大家详细介绍了VMware Workstation12安装Ubuntu和VMware Tools教程 具有一定的参考价值 xff0c 感兴趣的小伙伴们可以参考一下 之前我通过百度经验上的过程来安装Ubuntu16 xff0c
  • MySQL数据库改名的三种方法

    MySQL数据库改名的三种方法 前不久去面试 xff0c 被问到Innodb引擎的表如何改数据库名 xff0c 当时我也只回答了MyISAM改如何操作 xff0c 被一些细节问题打败 xff0c 真是操蛋 如果表示MyISAM那么可以直接去
  • C语言详解 FILE文件操作

    1 需要了解的概念 需要理解的知识点包括 xff1a 数据流 缓冲区 文件类型 文件存取方式 1 1 数据流 xff1a 指程序与数据的交互是以流的形式进行的 进行C语言文件的存取时 xff0c 都会先进行 打开文件 操作 xff0c 这个
  • wifi提速技巧:十大方法瞬间提升wifi速度

    手机wifi速度慢真是很让人苦恼 xff0c 有什么有效的wifi提速方法吗 当然有啦 绿茶小编今天就为大家带来了提升wifi速度的十大方法 xff0c 能激活wifi表现 xff0c 提升无线网络哦 xff0c 快来看看吧 十大方法瞬间提
  • 如何消除步进电机的噪音与振动TMC

    步进电机的噪音来自哪里 由于步进电机由于结构简单 控制方便 安全性高 成本低 停止时候力矩大 在低速情况下不需要减速机就可以输出很大的力矩 相比直流无刷和伺服电机 步进电机不需要复杂的控制算法也不需要编码器反馈情况下可以实现位置控制 被用在
  • ROS Navigation Tuning Guide(导航调试指南)

    ROS Navigation Tuning Guide 导航调试指南准备工作距离传感器里程计定位 速度与加速度的设置获得最大速度获得最大加速度设置最小值 xff38 xff39 方向的速度 Global Planner接口参数 Local

随机推荐

  • 网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

    前言 xff1a 作为一个程序员 xff0c 刚刚接触前端知识的时候 xff0c 就特别好奇 xff0c http是怎么通过一个url将报文从客户端传送到服务端 xff1f 提问 xff1a http的一个请求经历了一个什么样的过程 xff
  • 北斗实验总结(22.11.21)

    做的怎么样了 xff1f 可以在串口助手上实时显示北斗模块的时间 xff0c 并且是北京时间 基本实现所要求的实验现象 遇到的问题 xff08 1 xff09 在没有拿到模块的时候 xff0c 运行代码没有错误 xff0c 就认为能够实现所
  • 解决Ubuntu“无法定位软件包 xxx”的问题

    配置Ubuntu系统时发现有些东西无法安装 xff0c 可能是软件源出了问题 xff0c 需要重新配置 目录 1 安装vim xff08 可跳过 xff09 2 备份软件源配置 3 配置软件源 4 重新获取软件源列表 1 安装vim xff
  • 解决windows 10无法使用ping命令

    在近期使用电脑的时候发现我的电脑突然无法使用 ping 命令了 xff0c 这让我一个网络工程的程序员十分的纳闷 xff0c 然后自己在网上找了资料发现时环境变量的问题 xff0c 现在我就带大家解决一下这个问题 xff1a 出现问题 xf
  • macOS终端设置http与https代理

    查看你的节点的代理端口 下面配置以我的代理为准配置 xff1a 运行命令 vim bashrc xff0c 将以下内容导入 xff1a xff08 如果没有bashrc文件可以自己创建一个出来 xff09 export http proxy
  • 记录一个Charles下载安装之后抓取不到localhost的问题

    下载好Charles下载后跟着指南设置好http等所有的设置 xff0c 发现还是抓去不到本地的host的http请求 虽然设置了Charles代理设置 xff0c 但是依然不会走本地host的 xff0c 要让走本地代理可以用一下方式访问
  • 解决Mysql ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/tmp/mysql.sock‘

    记录一次Mac使用brew安装mysql后 xff0c 无法正常打开问题 在使用brew安装好mysql后 xff0c 发现使用启动命令 xff1a mysql server start 提示 xff1a xff08 两种可能情况 xff0
  • 简单分析DMVPN技术

    定义 xff1a 动态多点VPN 技术组成 xff1a MGRE 43 NHRP 43 IPSEC MGRE 解决隧道的封装技术NHRP 解决多点网络的通信技术IPSEC 解决专线的加密技术 技术特点 xff1a 由客户自行配置维护 xff
  • 小型企业网的搭建(企业网三层架构)

    将邮箱放置在这个链接里面 xff0c 我私信发送配置给你们 邮箱地址填写处 xff0c 点击这里直接跳转 需要配置的同学请手动去github clone xff0c 不了解github的同学建议花时间学习一下 xff0c 受益无穷 xff0
  • Linux各种(常用)编辑器

    了解如何通过命令行快速有效地编辑文件对每个Linux系统管理员都至关重要 文件编辑每天执行 xff0c 无论是配置文件 xff0c 用户文件 xff0c 文本文档还是您需要编辑的任何文件 这就是为什么选择一个喜欢的命令行文本编辑器并掌握它的
  • C语言实现1/1-1/2+1/3-...-1/100求和

    观察题目要求可以看出 xff0c 底数为奇数是前面符号为正 xff0c 偶数是则为负 那么我们可以考虑使用一下方式完成求解 解法一 xff1a span class token macro property span class token
  • 什么是localhost(127.0.0.1)?

    什么是本地主机 xff1f 当你在计算机上 ping IP地址时 xff0c 你尝试联系互联网上的另一台计算机 xff0c 但是当你ping IP地址127 0 0 1时 xff0c 你正在与本地主机通信 localhost 始终是你自己的
  • OpenCV图像处理技术——图像直方图

    OpenCV图像处理技术 图像直方图 Fu Xianjun All Rights Reserved 图像直方图 图像直方图是图像内灰度值的统计特性与图像灰度值之间的函数 xff0c 直方图统计图像内各个灰度级出现的次数 直方图是数值数据分布
  • 【wireshark】Ubuntu 安装 wireshark 以及 wireshark 过滤器的使用

    目录 1 安装wireshark 2 wireshark 过滤器比较符号 3 wireshark 过滤方式 1 根据 IP 地址过滤 2 根据端口号过滤 3 根据报文长度过滤 4 HTTP协议过滤 参考文章链接 xff1a Wireshar
  • C++学习001:对象、可扩展性、编译型语言、相较于C的变化

    1 面向对象 基于对象 基于过程的区别 基于过程 xff1a 从上到下依次执行 xff0c C语言 cpp额外实现了基于对象和面向对象 基于对象 xff1a 类作为结构 类的成员作为对象 基于对象就是通过封装对象方便了程序过程中发生的突发事
  • Arduino基础入门篇23—串口通讯

    在很多时候 xff0c Arduino需要和其他设备相互通讯 xff0c 而最常见最简单的方式就是串口通讯 本篇介绍Arduino硬件串口通讯 xff0c 了解相关函数的使用 1 硬件串口 在PC机上最常见的串行通讯协议是RS 232串行协
  • 基于Qt的车载GPS监控系统(7)数据记录

    基于Qt的车载GPS监控系统 xff08 7 xff09 数据记录 数据日志显示界面 系统数据记录功能实现说明 1 通过一个线程定时记录系统当前的温度数据 2 通过数据日志界面显示保存的日志数据 数据记录线程代码 span class hl
  • 嵌入式系统重定向printf的三种方法

    对printf 进行重定向的三种方法 方法1 使用MircoLib并重定义fputc方法2 停用半主机模式 xff0c 在MDK中使用标准库重定向printf 方法3 在Gcc中使用标准库重定向printf 1 MDK使用MircoLib并
  • Windows API程序入门学习(1)

    导航 Windows API程序入门学习 xff08 1 xff09 学习目的作业要求实现步骤参考书籍实现代码运行结果 Windows API程序入门学习 xff08 1 xff09 学习目的 了解 windows操作系统应用程序开发的基本
  • 嵌入式系统基础学习笔记(四)

    目录 一 GDB调试简例1 1 例11 2 例2 二 OpenCV入门2 1 在Windows下使用OpenCV 3 4 82 1 1 OpenCV的安装与配置2 1 2 一个简单的OpenCV对图片特效显示例子 2 2 在Ubuntu18