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

发布于:2024-05-04 ⋅ 阅读:(23) ⋅ 点赞:(0)

一 函数的基本操作

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


网站公告

今日签到

点亮在社区的每一天
去签到