嵌入式人工智能应用-第三章 opencv操作1

news/2024/10/22 11:13:59/

一 函数的基本操作

1.1 图像的存取和显示

有多种方式从现实世界中获取数字图像:数码相机,扫描仪,计算机断层扫描和磁共振成像等等。在任何情况下,人类看到的都是图像。然而,当将其转换为数字设备时,数字设备记录的是图像中每个点的数值

在这里插入图片描述Mat 类中有一些基本属性:cols :矩阵列数;rows:矩阵行数;channels:通道数;type:数据类型;total:矩阵总元素数;data:指向矩阵数据块的指针。其中 Mat 排列方式如下:
在这里插入图片描述
OpenCV 提供了两个最常用的方法,imread 和 imwrite 方法,用于读取和保存一张图片。学习 OpenCv就需要记住它提供的这些方法名称,然后了解其作用。正如业界流行的码农,一些通用的算法具体怎么实现的我们不管,但是需要知道它是用来干嘛的,这样才能很好地用。举个例子,比如用砖砌墙,需要了解砖的材质,这样才知道哪里用什么样的砖,比如承重问题,还需要知道有那些砖,这样才能码出不同花样的墙,还需要了解他们的属性,方便最后的修整

1.2 代码演示

参考代码:

include <opencv2/highgui.hpp>//所在头文件
void cv::imshow ( const String & winname,InputArray mat)

使用 imread 方法读取一张图片,图片数据存储在 Mat 类型的变量中,然后使用 clone 方法克隆一张照片,使用 imwrite 方法将克隆的照片写入到 test1.jpg 中。使用 imshow 方法来显示一张图片,调用 waitKey方法会让上面的 imshow 显示的窗口驻留

#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc,char* argv[])
{Mat img = imread("test.jpg");Mat img1 = img.clone();imwrite("test1.jpg",img1);imshow("img",img);waitKey(0);return 0;
}

1.3 makefile文件

这里的 CFLAGS 一般用于 C 编译器的编译选项,这里当做一个普通的变量使用,使用 pkg-config 命令得到 OpenCV 的头文件目录。LDLIBS 也用作一个普通的变量,用于存储 OpenCV 链接相关库

CFLAGS := $(shell pkg-config --cflags opencv)
LDLIBS := $(shell pkg-config --libs opencv) -lstdc++
target := img_show
SRC_FILES := $(target).cpp
$(CC) := gcc
$(target): $(target).o$(CC) -o $(target) $(target).o $(CFLAGS) $(LDLIBS)
$(target).o: $(SRC_FILES)$(CC) -c $(SRC_FILES) $(CFLAGS)
clean:rm -rf *.o *1.jpg $(target)

1.5 实验结果

在这里插入图片描述

2 获取摄像头

OpenCV 的一个目标是提供易于使用的计算机视觉接口,从而帮助人们快速建立精巧的视觉应用。
OpenCV 库包含从计算机视觉各个领域衍生出来的 500 多个函数,包括工业产品质量检验、医学图像处理、安保领域、交互操作、相机校正、双目视觉以及机器人学。
因为计算机视觉和机器学习经常在一起使用,所以 OpenCV 也包含一个完备的、具有通用性的机器学习库(ML 模块)。这个子库聚焦于统计模式识别以及聚类。ML 模块对 OpenCV 的核心任务(计算机视觉)相当有用,但是这个库也足够通用,可以用于任意机器学习问题

2.1 基本原理展示

OPENCV 的视频采集流程

1.在 OpenCV 中,首先 CvCapture*cvCaptureFromCAM( int index );函数是用来初始化,从摄像头中获取视频,参数 index 为要使用的摄像头索引,如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1 应该便可以。本实验摄像头设备为 video2,所以 index 为 2
2.获取完视频我们再创建窗口显示图像。
3.循环从摄像头或者文件中抓取并返回一帧,再显示到 LCD 屏上。
4.最后释放 CvCapture 结构;关闭所有窗口,释放窗口分配的内存;释放 img 所指的内存。

2.2 参考代码

#include <opencv2/opencv.hpp>
#include <iostream>
#include"cv.h"
#include"highgui.h"
#include"iostream"
using namespace std;
using namespace cv;
int main(int argc,char* argv[])
{CvCapture* cap;cap=cvCaptureFromCAM(2);if(!cap){cout<<"create camera capture error"<<endl;return -1;}cvNamedWindow("img",1);IplImage* img;cvWaitKey(2);while(1){img=cvQueryFrame(cap);if(!img)break;cvShowImage("img",img);cvWaitKey(3);}cvReleaseCapture(&cap);cvDestroyAllWindows();cvReleaseImage(&img);return 0;
}

2.3 编写makefile文件

CFLAGS := $(shell pkg-config --cflags opencv)
LDLIBS := $(shell pkg-config --libs opencv) -lstdc++
target := usbCamera
SRC_FILES := $(target).cpp
$(CC) := gcc
$(target): $(target).o$(CC) -o $(target) $(target).o $(CFLAGS) $(LDLIBS)
$(target).o: $(SRC_FILES)$(CC) -c $(SRC_FILES) $(CFLAGS)
clean:rm -rf *.o $(target)

3 问题记录

3.1 如果无法检测到usb摄像头

USB 模块摄像头为免驱摄像头,实际上也是需要驱动的,需要配置内核里的免驱选项。

3.2 重新编译内核,在烧入到系统中

修改内核配置选项操作方法:键入上下左右键可移动光标,回车进入子选项。光标选到相应选项,键入字母“y”,将该选项设置为“*”,则将驱动设置为静态加载模式,模块驱动编译到内核中,启动时自动加载;键入“m”,将该选项设置为“m”,设置为动态加载模式,模块会被编译,但不会被编译到内核,需要手动使用 insmod 或 modprobe 命令进行加载;键入“n”,将该选项设置为“”,不编译该模块,不使用该功能。

在这里插入图片描述

3.3 结果验证

设备的验证就是烧写完毕后,启动系统,然后插上任意 UVC 类 USB 摄像头,首先查/dev/video*, 在插入和拔出之间,是否多了 video 设备文件,如果多了,基本确定驱动正常了,然


http://www.ppmy.cn/news/1457785.html

相关文章

ubuntu20部署3d高斯

3d高斯的链接&#xff1a;https://github.com/graphdeco-inria/gaussian-splatting 系统环境 ubuntu20的系统环境&#xff0c;打算只运行训练的代码&#xff0c;而不去进行麻烦的可视化&#xff0c;可视化直接在windows上用他们预编译好的exe去可视化。&#xff08;因为看的很…

tracert命令

Tracert&#xff08;跟踪路由&#xff09;是路由跟踪实用程序&#xff0c;用于确定IP数据报访问目标所采取的路径。Tracert命令用IP生存时间&#xff08;TTL&#xff09;字段和ICMP错误消息&#xff0c;来确定从一个主机到网络上其他主机的路由。 命令格式&#xff1a;tracert …

中国棋手再夺世界桂冠,李轩豪问鼎第五届梦百合杯世界围棋公开赛

5月4日,第五届“MLILY梦百合0压床垫杯”世界围棋公开赛决赛在江苏省如皋市圆满结束,中国棋手党毅飞和李轩豪展开巅峰对决,最终,李轩豪执白168手战胜党毅飞,以3比1的比分夺得桂冠并获得由MLILY梦百合赞助的180万冠军奖金,这是李轩豪个人职业生涯中首次问鼎世界冠军,成为世界棋坛…

Redis是什么? 日常运维 Redis 需要注意什么 ? 怎么降低Redis 内存使用 节省内存?

你的项目或许已经使用 Redis 很长时间了&#xff0c;但在使用过程中&#xff0c;你可能还会或多或少地遇到以下问题&#xff1a; 我的 Redis 内存为什么增长这么快&#xff1f;为什么我的 Redis 操作延迟变大了&#xff1f;如何降低 Redis 故障发生的频率&#xff1f;日常运维…

创建Chrome插件:自动刷新网页

创建Chrome插件&#xff1a;自动刷新网页 前言 在日常工作和生活中&#xff0c;我们经常需要频繁刷新网页以获取最新的数据和信息。无论是开发人员进行网站测试&#xff0c;还是用户关注实时股市动态&#xff0c;手动刷新网页既耗时又低效。因此&#xff0c;本文将介绍如何创…

【隧道篇 / WAN优化】(7.4) ❀ 03. WAN优化的原理 ❀ FortiGate 防火墙

【简介】相信对WAN优化感兴趣的人都会有疑问&#xff0c;WAN优化真的有作用吗&#xff1f;如果真的有作用&#xff0c;那是根据什么原理呢&#xff1f;让我们来更深入的了解一下。 客户端和服务器端 其实很多人在一开始看到WAN优化这个词&#xff0c;就自然的以为上网速度太慢&…

【R语言数据分析】卡方检验

目录 交叉卡方检验 配对卡方检验 趋势卡方检验 交叉卡方检验 交叉卡方表用于比较组间“率”的差异。适用于分类型变量&#xff0c;被检验的分类变量应该是无序分类变量&#xff0c;分组变量可以是有序分组也可以是无序分组。比如比较两种药物治疗某个疾病的效率&#xff0c;…

Python中的property装饰器:深入解析与实用示例

Python中的property装饰器&#xff1a;深入解析与实用示例 一、引言 在Python中&#xff0c;property装饰器是一个强大的工具&#xff0c;它允许我们定义类的属性&#xff0c;同时保持对这些属性的访问控制。这意味着我们可以在不破坏封装性的前提下&#xff0c;提供对类内部…