当前位置: 首页 > news >正文

Linux上位机开发实战(基本图像处理)

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

        linux平台上面,有很多场景是需要处理图像。图像本身自带了很多信息,不仅仅是拿来拍照、录视频。我们可以从图像里面,提取很多的有用信息,比如说人脸识别、二维码识别、ocr识别。今天,我们可以从图像显示开始,然后转到视频、以及信息提取上面。

1、opencv库

        当前opencv基本是图像处理的标配动作。很多的算法,库都帮我们写好了。不需要自己去造轮子。这里使用opencv的时候,也不要用python,因为很多嵌入式板子没有python环境。所以,我们直接用cpp写代码就好了。

2、该硬件加速就用硬件加速

        虽然opencv可以帮我们做很多事情,但是上面很多的功能都是通过软件实现的。这个时候,如果soc帮我们做了硬件加速,比如说硬件编码、硬件解码、dma、图像显示加速,这个时候就需要转成硬件加速的方式来实现,而不是用软件来实现。虽然软件也可以相同的功能,但是在处理效率上,和硬件相比较要差很多。

3、先图像,再视频

        所谓的视频,其实就是一张、一张的图像构成。我们会处理单张图片,其实就可以处理视频数据,这两者没有本质的区别。就嵌入式设备而言,是不会处理单张图片的,一般都是为了处理视频而存在的。

4、usb相机更方便我们使用

        嵌入式开发板上面如果需要处理视频,一般有两种方式,一种是usb camera,还有一种是mipi camera。两者的区别就是,前者本身包含了isp处理,后者需要自己isp处理。所以,对于一般的场景,其实usb camera就够了。我们把精力放在图像处理本身上面,最多做一些光源控制,就可以了。

        另外目前处理camera之外,其他类似lidar数据也可以一起处理。但是camera和lidar之间一般都需要标定,这个可能稍微复杂一些。但是lidar本身有深度信息,这是camera比拟不了的。

5、opencv和qt的结合

        简单来说,我们一般通过opencv或者是v4l2拿到图像之后,直接用qlabel来显示图像。至于如何从图像中获取信息,放在后台来做就好了。而图像的更新,也可以通过定时器来进行处理。这些都是opencv和qt处理的一般套路。对于图像中的信息,可以借助于qt本身自带的控件来显示和反馈。

6、最简单的qt图像显示

        这里,我们介绍一种最简单的图像处理方法。不使用QWidgetApplication.cpp来处理,而是直接用main.cpp来处理,借助于QImage和QPixmap处理之后,只用QLabel显示即可。

#include <QtWidgets/QApplication>
#include <opencv2/opencv.hpp>
#include <QImage>
#include <QPixmap>
#include <QLabel>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);

	// read image
	cv::Mat originalImage = cv::imread("lena.png");

	// transfer image to gray
	cv::Mat grayImage;
	cv::cvtColor(originalImage, grayImage, cv::COLOR_BGR2GRAY);

	// do threshold to gray image
	cv::Mat binaryImage;
	cv::threshold(grayImage, binaryImage, 128, 255, cv::THRESH_BINARY);

	// transfer image to qimage and qpixmap
	QImage qImage(binaryImage.data, binaryImage.cols, binaryImage.rows, binaryImage.step, QImage::Format_Grayscale8);
	QPixmap pixmap = QPixmap::fromImage(qImage);

	// show image in qlabel
	QLabel label;
	label.setPixmap(pixmap);
	label.show();

	return a.exec();
}
http://www.dtcms.com/a/76554.html

相关文章:

  • FSSD:超越传统的目标检测利器
  • Git删除并重新推送远程分支操作
  • (C语言)理解 回调函数 和 qsort函数
  • 如何理解变量提升和 var、let、const间的区别
  • 如何使用 DeepEval 优化 Elasticsearch 中的 RAG 检索
  • java后端怎么写好根据角色控制查询不同数据,
  • AOP+Nacos实现动态数据源切换
  • 企业级云MES全套源码,支持app、小程序、H5、台后管理端
  • 【AI】在AWS AI芯片服务上部署运行Qwen 2.5模型
  • 科技云报到:AI Agent打了个响指,商业齿轮加速转动
  • Android 第四次面试总结(自定义 View 与事件分发深度解析)
  • pytorch小记(十):pytorch中torch.tril 和 torch.triu 详解
  • 一场由 ES 分片 routing 引发的问题
  • 【含文档+PPT+源码】基于小程序的智能停车管理系统设计与开发
  • 【数据分享】1999—2023年地级市固定资产投资和对外经济贸易数据(Shp/Excel格式)
  • 咖啡点单小程序毕业设计(JAVA+SpringBoot+微信小程序+完整源码+论文)
  • 卷积神经网络(CNN)与反向传播
  • 威联通 NAS 的 Docker 镜像与安装 logseq
  • 案例驱动的 IT 团队管理:创新与突破之路:第三章 项目攻坚:从流程优化到敏捷破局-3.2.3技术债务的可视化管理方案
  • 永磁同步电机模型第二篇之两相电机实时模型
  • 使用 ESP8266 和 Android 应用程序实现基于 IOT 的语音控制家庭自动化
  • Apache DolphinScheduler:一个可视化大数据工作流调度平台
  • VSTO(C#)Excel开发13:实现定时器
  • Search after解决ES深度分页问题
  • Modbus通信协议基础知识总结
  • 003-掌控命令行-CLI11-C++开源库108杰
  • 音频大语言模型可作为描述性语音质量评价器
  • java学习笔记4
  • Java动态代理模式深度解析
  • Git 分支删除操作指南(含本地与远程)