0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV的基础使用方法及运行成果

恩智浦MCU加油站 来源:恩智浦MCU加油站 作者:恩智浦MCU加油站 2022-11-17 09:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本期将带大家带来一期可以称作番外篇的一期:暂且称为OpenCV实战篇,将介绍OpenCV的一些基础使用方法,以及在MCU上实际运行起来的效果。

首先是OpenCV的简单介绍,前面的文章已经介绍过,OpenCV具有模块化的结构,这意味着其中包含了多种共享/静态库,概括如下:

  • Core functionality:定义了所要用到的基础数据结构体

  • Image Processing:包含了多种线性/非线性的图像滤波器,几何图像变换等

  • Video:视频处理模块,包括运动估计,背景减除等

  • Calib3d:单目/双目相机支持,3D重建等

  • Features2D:特征检测

  • Objdetect:目标检测等,例如人脸、眼睛等

  • Highgui:简单的UI功能

  • Video I/O:视频编解码接口

  • Gpu:gpu加速算法

所有的OpenCV类/函数都被归在cv命名空间下。因此,应用层想要访问任何代码都需要使用cv::限定符或是直接使用using namespace cv,例如:

cv::Mat H = cv::findHomography(points1, points2, CV_RANSAC, 5);
或是:
using namespace cv;
Mat H = findHomography(points1, points2, CV_RANSAC, 5 );

同时,由于当前或是之后的OpenCV源码中导出的外部符号,可能会和STL或是其他库中的名字冲突。这就建议用户在使用时,要显示指定已避免冲突,例如:

Mat a(100, 100, CV_32F);
randu(a, Scalar::all(1), Scalar::rand()));
cv::log(a, a);
a /= std::log(2.);

接下来要讲的是一个OpenCV中的重要结构Mat。

如果你想要使用OpenCV的话,Mat是你无论如何躲不过的一步。通俗点讲,这个结构体代表了一种n维数组,并且能够抽象表达成矩阵/图像/光流图等。

其公共属性如下:

attribute

description

MatAllocator* allocator

Custom allocator

int cols

The image’s width

int rows

The image’s height, the cols & rows will be (-1, -1) when the matrix has more than 2 dimensions

uchar* data

Pointer to the data

uchar* dataend

-

uchar* datalimit

-

uchar* datastart

-

int dims

The matrix dimensionality, >=2

int flags

-

int* refcount

Pointer to the reference counter

MSize size

-

MSize step

-

作为一个名副其实的C++类,OpenCV为其编写了多种构造函数,这也使得有多种方式能够创建一个cv::Mat对象,用的比较多的几种方式如下:

1.使用cv::Create(nrows, ncols, type) 或是 cv::Mat(nrows, ncols, type[, fill,_vale])如有雷同,那必然不是巧合。

// make 7x7 complex matrix filled with 1+3j.
cv::Mat M(7,7,CV_32FC2,Scalar(1,3));
// and now turn M to 100x60 15-channel 8-bit matrix.
// The old content will be deallocated
M.create(100,60,CV_8UC(15));

2.使用拷贝构造函数,时间复杂度为O(1),因为这种方式将只拷贝header并增加引用计数,数据部分将公用,也称作浅拷贝。当然也可以使用深拷贝,cv::clone()可以做到这一点。

3.仅构造头部,并使用用户预分配数据:
void init_mat_with_ptr(const unsigned char* pixels,
                         int width, int height, int step)
{
    cv::Mat img(height, width, CV_8UC3, pixels, step);
    cv::GaussianBlur(img, img, cv::Size(7,7), 1.5, 1.5);
}

4.使用MATLAB格式的矩阵初始化法,cv::zeros(), cv::ones(), cv::eye()

5.对象与数据空间的释放:cv::release()


了解了OpenCV的基础知识,下面是基于MCUXPresso的代码实测部分。这里我们基于SDK中的“Hello World”工程搭建我们的第一个OpenCV代码。小编先卖个关子,详细的工程配置方法将在下期为大家揭秘。

首先,要选取测试图,小编随便在手机里找了一张图片并裁成500*500的jpg图像,之后会对其进行解码随后将其放缩成(320, 240)。

为了方便我们在没有文件系统的MCU平台使用测试图像,需要借助一条汇编指令.incbin, 并且声明两个全局符号告诉代码数据位置:

  .global img_start
  .global img_end

img_start:
 .incbin "data/picture.jpg"
img_end:

接下来是main函数:

// decode the image
std::vector data(img_start, img_start + IMG_LEN);
cv::Mat img_encode(data);
cv::Mat img = cv::imdecode(img_encode, cv::IMREAD_UNCHANGED);
// resize the decoded imagecv::Mat resizeImg;
cv::resize(img, resizeImg, cv::Size(320, 240), cv::INTER_LINEAR);

编译下载后,让我们看看转出的数据是不是正确,我们就需要将数据传输到PC上进行验证:

1.在MCUXpresso IDE中添加一个memory窗口并且键入resizeImage.data:

fc0be33c-660f-11ed-8abf-dac502259ad0.png

2. 点击Export,输入起止地址,IDE会自动计算长度。选择保存类型为RAW Binary, 并选择本地保存位置

3.点击OK下载数据

4. 为了验证数据的准确性,我们直接编写一个简单的上位机OpenCV的基于Python的预览程序,代码中的文件名对应第2步保存的文件:

import numpy as np
import cv2 as cv 
img_raw_data = np.fromfile(“your_path/your_file_name.bin”, dtype=”uint8”)
img = np.reshape(img_raw_data, (240, 320, 3)) # the new shape
cv.imshow(“img”, img)
cv.waitKey(0)

注意:这里假设电脑上已经安装了Python,并且安装了numpy以及opencv代码库

5. 程序执行之后,让我们看看最终结果:

至此,我们就用了一个简单的代码验证了我们所编译的OpenCV库的正确性。下期小编将为大家揭秘,如何从0开始构建一个完整的OpenCV测试例程。

审核编辑:郭婷


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    22

    文章

    2129

    浏览量

    77376
  • OpenCV
    +关注

    关注

    33

    文章

    652

    浏览量

    45090

原文标题:这个秋天,OpenCV和MCU更配哟(实战篇)

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RTL9301管理型交换机DHCP Server使用方法

    RTL9301管理型交换机DHCP Server使用方法
    的头像 发表于 02-01 10:52 1498次阅读
    RTL9301管理型交换机DHCP Server<b class='flag-5'>使用方法</b>

    ups电源的作用和使用方法详解

    UPS(不间断电源)是一种重要的电力保护设备,主要用于在电网供电异常时提供临时的后备电源,并改善电源质量。以下是其核心作用和使用方法的详细介绍:一、UPS的主要作用核心:提供不间断电力断电保护:在
    的头像 发表于 01-08 09:21 1824次阅读
    ups电源的作用和<b class='flag-5'>使用方法</b>详解

    UV三防漆的使用方法

    ,紫外线照射下秒级固化成膜,大幅提升生产效率,广泛应用于汽车电子、工业设备、医疗器械等领域。UV三防漆的使用方法UV三防漆的核心原理UV三防漆内含光敏剂,在特定波
    的头像 发表于 12-31 17:19 1690次阅读
    UV三防漆的<b class='flag-5'>使用方法</b>

    没有专利的opencv-python 版本

    所有 官方发布的 opencv-python 核心版本(无 contrib 扩展)都无专利风险——专利问题仅存在于 opencv-contrib-python 扩展模块中的少数算法(如早期 SIFT
    发表于 12-13 12:37

    芯源IR调制器都有哪些具体使用?使用方法是怎样的?

    芯源IR调制器都有哪些具体使用?以及使用方法是怎样的?
    发表于 12-02 06:33

    堆栈的定义,堆栈的使用方法

    和使用; 对于8086CPU,进出堆栈的只能是2字节的数据。 2 堆栈的使用方法 常用的堆栈相关指令包括PUSH POP PUSHF和POPF,语法如下: PUSH 源操作数;将指定操作数入栈保护 POP
    发表于 11-21 06:49

    条码扫码设备的使用方法

    使用方法,能让其充分发挥价值,为各行业的规范化管理提供有力支撑。一、条码扫码设备的主要类型不同场景对条码扫码设备的需求存在差异,目前主流类型可分为四类,适配不同工作
    的头像 发表于 09-17 16:15 1164次阅读
    条码扫码设备的<b class='flag-5'>使用方法</b>

    零成本钢铁侠手套!树莓派+OpenCV 秒变手势遥控器!

    大家好,这是一个树莓派和OpenCV的连载专题。使用树莓派与OpenCV实现姿态估计和面部特征点追踪使用树莓派与OpenCV实现面部和运动追踪的云台系统使用树莓派和OpenCV实现手部
    的头像 发表于 08-16 16:16 1569次阅读
    零成本钢铁侠手套!树莓派+<b class='flag-5'>OpenCV</b> 秒变手势遥控器!

    如何使用树莓派与OpenCV实现面部和运动追踪的云台系统?

    大家好,这是一个树莓派和OpenCV的连载专题。使用树莓派与OpenCV实现姿态估计和面部特征点追踪使用树莓派与OpenCV实现面部和运动追踪的云台系统使用树莓派和OpenCV实现手部
    的头像 发表于 08-14 17:45 2414次阅读
    如何使用树莓派与<b class='flag-5'>OpenCV</b>实现面部和运动追踪的云台系统?

    如何使用树莓派+OpenCV实现姿态估计和面部特征点追踪?

    大家好,这是一个树莓派和OpenCV的连载专题。使用树莓派与OpenCV实现姿态估计和面部特征点追踪使用树莓派与OpenCV实现面部和运动追踪的云台系统使用树莓派和OpenCV实现手部
    的头像 发表于 08-13 17:44 1468次阅读
    如何使用树莓派+<b class='flag-5'>OpenCV</b>实现姿态估计和面部特征点追踪?

    如何板端编译OpenCV并搭建应用--基于瑞芯微米尔RK3576开发板

    运行opencv代码,来完成一些视觉内容,充分发挥该板的性能。要先编译opencv需要一些预先的准备工作首先更新软件包并安装必要的依赖:sudo apt update sudo apt upgrade
    发表于 08-08 17:14

    锡膏的储存及使用方法详解

    锡膏是一种常用的焊接辅助材料,广泛应用于电子、电器、通讯、仪表等行业的焊接工艺中。正确的储存和使用方法对于保证锡膏的品质和焊接效果至关重要。本文将就锡膏的储存和使用方法进行详细介绍,希望能对广大焊接工作者有所帮助。
    的头像 发表于 07-18 17:36 1658次阅读
    锡膏的储存及<b class='flag-5'>使用方法</b>详解

    【Milk-V Duo S 开发板免费体验】SDK编译、人脸检测、OpenCV测试

    文件传输至开发板; 运行 板端执行指令 chmod +x helloworld ./helloworld 打印对应的字符串 同样方法,根据官方示例程序,可以实现多种传感器和外设的驱动
    发表于 07-11 13:48

    如何在k230上运行OpenCV的代码?

    如何在k230上运行OpenCV的代码
    发表于 06-17 06:06

    LCR测试仪的使用方法与注意事项

    LCR测试仪的使用方法、操作注意事项及常见故障处理,帮助读者高效、安全地掌握这一仪器的使用技巧。   二、LCR测试仪的基本使用方法 1. 准备阶段 (1)设备检查:确保测试仪电源线、连接线完好,电源开关关闭。检查测试夹具或探针
    的头像 发表于 04-29 10:36 2w次阅读
    LCR测试仪的<b class='flag-5'>使用方法</b>与注意事项