上位机图像处理和嵌入式模块部署(qt图像处理)

news/2024/7/21 3:52:33 标签: 图像处理, 人工智能

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

        很多人一想到图像处理,本能的第一反应就是opencv,这也没有错。但是呢,这里面还是有一个问题的,不知道大家有没有想过,如果我们为了降低成本,需要把图像放到mcu来处理,这个时候应该怎么做呢?都知道,mcu的ram和flash都是有限的,根本无法容纳那么大的opencv库。所以,这边还是建议大家,opencv是可以用,但是基础的算法库最好还是可以自己写出来。

        对于写算法的人来说,最麻烦的事情,莫过于图片的读取和保存了,算法本身一般并不是那么复杂。所以这部分好在qt已经帮我们做了一部分,我们直接拿QImage类就可以实现基础的算法编写了。

1、相关类

        qt里面的QImage十分方便,输入路径,就是实现图片的保存和加载。

2、参考代码

        如下面代码所示,这就是一个简单的图像处理代码,将原来的彩色图片,变成了灰色图片。整个应用没有界面,就是一个单纯的应用。所有的操作都放在了processImage函数里面。

#include <QImage>
#include <QDebug>

void processImage(QString inputPath, QString outputPath) 
{
	// load image
	QImage inputImage(inputPath);
	if (inputImage.isNull()) 
	{
		qDebug() << "Failed to load image";
		return;
	}

	// get image infor
	int width = inputImage.width();
	int height = inputImage.height();

	// loop to process pixel
	for (int y = 0; y < height; ++y) 
	{
		for (int x = 0; x < width; ++x) 
		{
			QRgb pixel = inputImage.pixel(x, y);

			// get data
			int red = qRed(pixel);
			int green = qGreen(pixel);
			int blue = qBlue(pixel);

			// get gray
			int gray = qGray(red, green, blue);

			// set gray
			inputImage.setPixel(x, y, qRgb(gray, gray, gray));
		}
	}

	// save data
	if (!inputImage.save(outputPath)) 
	{
		qDebug() << "Failed to save processed image";
	}
}

int main() 
{
	// set input and output path
	QString inputPath = "D:/lena.png";
	QString outputPath = "D:/lena_new.png";

	// process image
	processImage(inputPath, outputPath);
	return 0;
}

        代码中因为还涉及到调试的部分,所以除了QImage之外,还需要把QDebug头文件包括进来。首先用QImage导入路径,判断是否为空,不为空则继续处理。接着获取图片的宽度和高度,依次获取图片的每个像素QRgb。读取到r、g、b之后,就可以通过qGray计算出对应的灰度值gray,这样最基本的算法就写好了。计算出来的gray通过setPixel保存在inputImage当中,并且在所有操作都完成之后,save到新的路径下面,这样图像处理就算是ok了。

3、实验和总结

        记得读书的时候,有一门《数字图像处理》的课程。老师们为了方便同学们快速学习算法,很多图片的加载和读取工作,老师们会自己写一个动态库帮忙完成。现在有了QImage之后,无疑是更方便了。对于基础的算法,大家还是最好自己可以写出来、调试出来。

        对于这个应用,大家先看一下能不能编译出来。编译出来之后,还要准备一张lena.png的图片,可以从这个地方下载,

https://github.com/mikolalysenko/lena/blob/master/lena.png

        接着启动应用,开始单步调试,如果没啥问题,应该就可以在D盘看到生成的新图片,打开看一下,如果发现是灰度图,那基本代表没有什么问题了。


http://www.niftyadmin.cn/n/5340432.html

相关文章

Java - 单元测试及Junit的使用讲解及练习

目录 &#x1f436;2.1 什么是单元测试 &#x1f436;2.2 测试分类&#xff1a; 1. &#x1f959;黑盒测试 2. &#x1f959;白盒测试 &#x1f436;2.3 Junit介绍 &#x1f436;2.4 Junit的基本使用步骤:(默认使用maven创建项目) 1. &#x1f959;pom.xml中引入依赖: 2…

web3d-three.js场景设计器-天空包围盒-TWEEN.js

THREE.JS 实现场景天空包围盒&#xff0c;为了让场景背景更具体&#xff0c;而不是呆板的纯色&#xff0c;可以给厂家添加围绕的包围盒。 这里使用球体来实现&#xff0c;球体中央则是场景给球体添加天空的渐变色加入场景 代码如下 function createSky( hemiLight) { const …

openssl3.2/test/certs - 004 - cross root and root cross cert

文章目录 openssl3.2/test/certs - 004 - cross root and root cross cert概述笔记END openssl3.2/test/certs - 004 - cross root and root cross cert 概述 索引贴 openssl3.2 - 官方demo学习 - test - certs 笔记 // \file my_openssl_linux_log_doc_004.txt // openssl…

JAVA 2个集合差集交集

// 创建第一个集合List<Integer> list1 new ArrayList<>();list1.add(1);list1.add(2);list1.add(3);// 创建第二个集合List<Integer> list2 new ArrayList<>();list2.add(2);list2.add(4);list2.add(5);// 将第一个集合转换为 HashSetSet<Intege…

locust快速入门--使用locust-plugins保存类似jmeter的csv数据

背景&#xff1a; 将locust测试的数据保存为类似jmeter一样的csv文件。 实现目标&#xff1a; 利用locust-plugins的功能&#xff0c;将数据保存为类似jmeter一样的csv文件每次结束测试时不需要退出locust程序&#xff0c;就可以将本次测试的数据进行保存 实现方式&#xf…

EGL + GBM + OPENGLES 最简实例

文章目录 前言一、GBM二、egl + gbm + opengles 最简 demo 实例1.egl_gbm.c2.编译和运行2.1 编译2.2 运行总结参考资料前言 本文主要介绍如何在 linux 下实现一个 egl + gbm + opengles 的最简demo 实例 软硬件环境 硬件:PC 软件:ubuntu18.04 egl1.4 opengles2.0 libgbm lib…

npm下载依赖报Python,c++等相关错误

执行npm install 下载时&#xff0c;报错&#xff0c;缺少python相关的错 解决方法&#xff1a; //下载python 1、 npm install --global --production windows-build-tools//配置环境 &#xff1a; 也可暂时不用配置,能用就不用配置&#xff08;npm config set python &qu…

HarmonyOS ArkUI 框架的实现原理和落地实践

HarmonyOS 操作系统特性 首先介绍一下鸿蒙操作系统&#xff0c;鸿蒙操作系统是华为设计的下一代分布式物联网操作系统&#xff0c;它首次引入了面向场景设计的分布式理念&#xff0c;同时能够实现一套操作系统通过裁减的方式适配到某种终端&#xff0c;它是华为面向万物互联理念…