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

一 函数的基本操作

1.1 图像的存取和显示

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

Mat 类中有一些基本属性:cols :矩阵列数;rows:矩阵行数;channels:通道数;type:数据类型;total:矩阵总元素数;data:指向矩阵数据块的指针。其中 Mat 排列方式如下:

OpenCV 提供了两个最常用的方法,imread 和 imwrite 方法,用于读取和保存一张图片。学习 OpenCv就需要记住它提供的这些方法名称,然后了解其作用。正如业界流行的码农,一些通用的算法具体怎么实现的我们不管,但是需要知道它是用来干嘛的,这样才能很好地用。举个例子,比如用砖砌墙,需要了解砖的材质,这样才知道哪里用什么样的砖,比如承重问题,还需要知道有那些砖,这样才能码出不同花样的墙,还需要了解他们的属性,方便最后的修整

1.2 代码演示

参考代码:

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

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

cpp 复制代码
#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 链接相关库

powershell 复制代码
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 参考代码

cpp 复制代码
#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文件

bash 复制代码
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 设备文件,如果多了,基本确定驱动正常了,然

相关推荐
工业机器视觉设计和实现10 分钟前
cnn突破四(生成卷积核与固定核对比)
人工智能·深度学习·cnn
FL16238631291 小时前
[C++]使用纯opencv部署yolov11旋转框目标检测
opencv·yolo·目标检测
我算是程序猿1 小时前
用AI做电子萌宠,快速涨粉变现
人工智能·stable diffusion·aigc
萱仔学习自我记录1 小时前
微调大语言模型——超详细步骤
人工智能·深度学习·机器学习
湘大小菜鸡1 小时前
NLP进阶(一)
人工智能·自然语言处理
XiaoLiuLB2 小时前
最佳语音识别 Whisper-large-v3-turbo 上线,速度更快(本地安装 )
人工智能·whisper·语音识别
哪 吒2 小时前
吊打ChatGPT4o!大学生如何用上原版O1辅助论文写作(附论文教程)
人工智能·ai·自然语言处理·chatgpt·aigc
Eric.Lee20212 小时前
音频文件重采样 - python 实现
人工智能·python·深度学习·算法·audio·音频重采样
爱喝白开水a2 小时前
关于大模型在企业生产环境中的独立部署问题
人工智能·深度学习·llm·大语言模型·ai大模型·计算机技术·本地部署大模型
不打灰的小刘3 小时前
大模型训练显存需求分析指南:从SFT到RLHF的实践之路
人工智能·深度学习