上位机图像处理和嵌入式模块部署(自定义算法)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        我们在使用opencv的时候,虽然大部分算法都不需要我们自己重头开始编写,但是总有一些关于我们自己产品的know-how,是之前库里本来就不存在的。所以,这个时候,我们还是希望能够借助于opencv实现一些自定义的算法,这样可以满足客户个性化的需求,也可以提高自己的竞争力。另外,即使是opencv库里面已经有的算法,由于它本身面对的是通用平台,因此很难对相关代码进行专门的硬件优化,所以即使是已经存在的算法,有的时候还是需要重新写一遍,出一个针对专门硬件的加速版本,这都是常有的事情。

1、复用之前的opencv部署步骤

        一开始,我们还是需要创建一个console工程、配置好include目录、配置好lib目录、拷贝好必要的dll文件、准备好测试图片,这些都是少不了的。由于这些内容之前都已经谈到过,所以,这里不再赘述。

2、编写自定义函数

        编写自定义函数的核心主要有三个,第一,相关的数据结构是什么?很明显,在opencv下面,数据的保存方式就是cv::Mat。第二,怎么获取像素值?一般来说,直接使用image.at<uchar>(i,j)的方式,就可以获得像素值。第三,怎么设置像素值,做法和第二点一样,不同的是前面是读取,这个直接赋值给它即可。所以,如果我们需要用它来写一个简单的二值化函数,一般可以这么来做,

#include <opencv2/opencv.hpp>
#include <iostream>// self defined image processing function
void customThreshold(const cv::Mat& inputImage, cv::Mat& outputImage, int thresholdValue) 
{// make sure this is single channel CV_Assert(inputImage.channels() == 1);// copy imageoutputImage = inputImage.clone();// loop to check each pixelfor (int i = 0; i < outputImage.rows; ++i) {for (int j = 0; j < outputImage.cols; ++j) {// get valueuchar pixelValue = outputImage.at<uchar>(i, j);// set valueoutputImage.at<uchar>(i, j) = (pixelValue > thresholdValue) ? 255 : 0;}}
}

3、补充完剩余的图像处理代码

        仅仅有customThreshold函数还是不够的,整个项目要想运行起来,还需要读取图片文件、保存图片文件、显示图片文件等内容。所以,我们继续把相关的代码补上即可,

// file starts here
int main() 
{// read imagecv::Mat image = cv::imread("D:/lena.png");// check if image has been loaded successfullyif (image.empty()) {std::cout << "unable to load image here" << std::endl;return -1;}// transfer image to gray typecv::Mat grayImage;cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);// transfer gray image to binary imagecv::Mat binaryImage;customThreshold(grayImage, binaryImage, 110);// show binary imagecv::imshow("Binary Image", binaryImage);// wait for inputcv::waitKey(0);return 0;
}

        首先,还是和以前一样,通过cv::imread的方法读取图片。接着判断图片是否为空。判断结束后,先是把image转成grayImage,然后把grayImage继续转成binaryImage,最后显示binaryImage即可。当然,这里会调用一下cv::waitKey,没有按键输入的话,图片窗口会一直处于显示状态。

4、编译和测试

        编译的话,主要看编译有没有出错、链接有没有出错、运行有没有出错,如果这几个部分都没有问题,那说明我们前面设置的环境都是ok的。这样,只需要看显示的图片有没有变成二值化即可。另外,也说明我们在完全没有借助opencv api的情况下,自己实现了一个自定义函数,这在后续的产品开发中是非常有用的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

控制项目风险

一、风险预算 暴雪公司经理艾莉森&#xff0c;暴雪公司是一家小型工业企业&#xff0c;该公司的高管为了降低生产成本&#xff0c;决定搬迁工厂。项目经理明白实际情况与初始计划之间常常会有很大的出入。项目经理需要事先为一些事情做好准备&#xff0c;并在项目运作或预算方面…

python报错:TypeError: ‘str‘ object is not callable

错误打印&#xff1a; python 代码&#xff1a; datalist [];datadictTmp (};mch 48;for i in range(1,10):datadict.clear()mch 48 ## 报错位置 datadict[parent_ID] str(i)chr(mch)mch 1datadict[paymentMethod] str(i)chr(mch)mch 1datadict[payer] str(i)chr(mc…

kafka入门(八):kafka分区分配策略

kafka分区分配策略 参数&#xff1a; Kafka提供了消费者客户端参数partition.assignment.strategy来设置消费者与订阅主题之间的分区分配策略。 默认情况下&#xff0c;此参数的值为 org.apache.kafka.clients.consumer.RangeAssignor&#xff0c;即采用RangeAssignor分配策略…

【服务器】安装宝塔面板

目录 &#x1f33a;【前言】 &#x1f33c;【前提】连接服务器 &#x1f337;方式一 使用工具登录服务器如Xshell &#x1f337;方式二 阿里云直接连接 &#x1f33c; 1. 安装宝塔 &#x1f337;获取安装脚本 方式一 使用下面提供的脚本安装 方式二 使用官网提供的脚本…

notepad++ v8.5.3 安装插件,安装失败怎么处理?下载进度为0怎么处理?

notepad v8.5.3 安装插件&#xff0c;安装失败&#xff1f;下载进度为0&#xff0c;怎么处理&#xff1f; 安装 进度 进度条没有进度 &#xff0c;然后就退出了&#xff0c;自动打开程序&#xff0c;不知道什么问题&#xff0c;插件管理下面也没有插件显示 找到问题了&#x…

2024年最全春节攻略,外贸人看这一篇就够了

凡事预则立&#xff0c;不预则废--《礼记•中庸》 不知不觉春节将至&#xff0c;很多外贸公司以及工厂也都公布了放假时间&#xff0c;虽然放假时间有长有短。很多人应该都有点迫不及待想要快点放假&#xff0c;回家过春节。春节毕竟是我们每年最重大的节日&#xff0c;也是家…

梯度下降算法实现原理

文章目录 什么是梯度梯度下降算法(通过迭代解决目标函数最小值)代码实现拓展: 什么是梯度 在了解梯度之前,我们先了解一下导数: 用于描述曲线变换快慢的一个量,在几何意义上表示为函数的斜率,数学定义为: f ′ ( x ) lim ⁡ △ x → 0 f ( x △ x ) − f ( x ) △ x f(x) \…

【Python进阶编程】python编程高手常用的设计模式(持续更新中)

Python编程高手通常熟练运用各种设计模式&#xff0c;这些设计模式有助于提高代码的可维护性、可扩展性和重用性。 以下是一些Python编程高手常用的设计模式&#xff1a; 1.单例模式&#xff08;Singleton Pattern&#xff09; 确保一个类只有一个实例&#xff0c;并提供全局…

Taro框架如何抹平各端的差异

Taro 是一款开源的跨端统一开发框架&#xff0c;它通过以下方式来抹平各端&#xff08;如微信小程序、支付宝小程序、H5、React Native 等&#xff09;的差异&#xff1a; 统一的编程模型&#xff1a;Taro 提供了与 React 类似的编程模型&#xff0c;开发者可以使用 JSX 语法和…

幻兽帕鲁服务器搭建,包教包会

服务器搭建 幻兽帕鲁服务器搭建&#xff0c;包教包会&#xff0c;不会评论区评论手把手帮忙搭建 一、steamCMD安装 1、安装screen&#xff1a; yum install screen -y 2、切换用户&#xff1a; su -ls /bin/bash steam 3、切换至steam用户目录&#xff1a; cd ~ 4、下载ste…

CrawlSpider【获取当前访问链接的父链接和锚文本】代码逻辑

tip: 超链接对应的文案通常被称为“锚文本”&#xff08;anchor text&#xff09; 在继承CrawlSpider父类的前提下&#xff0c;编写一个 fetch_referer 方法获取当前response.url的父链接和锚文本。 实现逻辑&#xff0c;通过一个例子简要说明&#xff1a; 如果设置 start_…

快快销ShopMatrix 分销商城多端uniapp可编译5端 - 订单金额满多少,一次性订单金额满多少,充值多少升级

“订单金额满多少”或“一次性订单金额满多少”进行升级的商业逻辑。这种策略通常是为了激励用户增加消费额度、提高客单价或者提升用户的活跃度与忠诚度&#xff0c;具有以下好处&#xff1a; 刺激消费增长&#xff1a;商家设置一定的门槛&#xff0c;如一次性订单金额满300元…

C++基础语法和用法

文章目录 1.hello world2.引入namespace(命名空间/域问题)3.输入输出4.缺省参数/默认参数5.函数重载6.引用7.内联函数8.auto关键字&#xff0c;基于范围的for循环&#xff0c;空指针NULL8.1 auto8.2 基于范围的for循环8.3 nullptr 1.hello world #include <iostream> us…

世界经济论坛发布《2024年全球风险报告》和《2024年全球网络安全展望》:网络攻击是2024世界5大风险之一,网络安全经济增速是全球经济的四倍

在近日举行的世界经济论坛 (WEF)上&#xff0c;发布了《2024 年全球风险》报告和《2024年全球网络安全展望》两份重磅报告&#xff0c;分别揭示了全球经济今年和未来几年可能面临的一些关键风险和问题&#xff0c;以及网络安全与全球经济之间的逻辑关系。 2024年全球风险报告 今…

SQL数据库的创建操作

1.如何才能创建一个库、表 CREATE DATABASE 数据库: SHOW databases&#xff1b; USE 数据库; DROP DATABASE 数据库&#xff1b; /*数据表操作/ CREATE TABLE teacher( id int (4) not null primary key auto_increment, name char(20)not null, sex char(10) notnul…

ES6笔记-symbol

ES6 symbol 是什么 ES5的对象属性名是字符串&#xff0c;这容易造成属性名的冲突。symbol是一种机制&#xff0c;保证每个属性的名字都是独一无二的。这样就从根本上防止属性名冲突。 它是一种原始数据类型Symbol,表示独一无二的值。它属于javaScript语言的原生数据类型之一。…

CloudPanel RCE漏洞复现(CVE-2023-35885)

0x01 产品简介 CloudPanel 是一个基于 Web 的控制面板或管理界面,旨在简化云托管环境的管理。它提供了一个集中式平台,用于管理云基础架构的各个方面,包括虚拟机 (VM)、存储、网络和应用程序。 0x02 漏洞概述 由于2.3.1 之前的 CloudPanel 具有不安全的文件管理器 cook…

MyBatis第四课动态SQL

目录 引言&#xff1a; 一、动态SQL书写方式 二、会帮我们处理多余的字符 方法2:使用where也可以进行消除and&#xff0c;但是出现的问题 三、标签 四、foreach(循环操作) ​编辑 Mybatis传递List集合报错 Available parameters are [collection, list] 和 引言&…

Apache Spark中的广播变量分发机制

Apache Spark中的广播变量提供了一种机制&#xff0c;允许用户在集群中共享只读变量&#xff0c;并且每个任务都可以访问这个变量&#xff0c;而不需要在每次任务之间重新发送该变量。这种机制特别适用于在所有节点上都需要访问同一份只读数据集的情况&#xff0c;因为它可以显…

Linux: make/Makefile 相关的知识

背景&#xff1a; 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的 规则来指定&#xff0c;哪些文件需要先编译&#xff0c…