基于qt的opencv代码加速(代码片段)

会飞的毛毛虫_ 会飞的毛毛虫_     2023-01-03     400

关键词:

Opencv,for循环等的C++代码加速

一、使用OpenGL对Opencv进行加速

1. 什么是OpenGL?

OpenCL 是一个用于异构平台(heterogeneous platform)下编写并行程序的框架. OpenCL 的开发者可以使用所有可用的兼容计算设备, 他们找到计算机上的相应设备,然后将合适的计算任务分配给这些设备。简单理解就是利用显卡高效的处理三维二维数据。

  • OpenCV开发者无须知道任何关于OpenCL的底层实现,因为OpenCV已经将OpenCL的细节隐藏在了 Transparent API中。

2. 什么是Transparent API?

Transparent API 是一种简单的方法,其对现有代码进行最小的更改,便可以将硬件加速无缝地添加到OpenCV代码中。通过进行很小的更改, 可以使现有代码提高数量级的加速。

  • Transparent API 主要是使用了OpenCL来进行加速,尽可能地调用硬件现有的最好资源来运行代码(只加速部分代码),如有GPU的情况下,就不使用CPU。所以一般情况下,可以达到加速的作用!

  • 使用Transparent API 非常简单。通过更改一个关键字,即可以获得显著的性能提升(如将Mat换成UMat)。

3. 什么是UMat?

UMat(Unified Matrix)是OpenCV3.0引入的新特性,属于OpenCV Transparent API(T-api or TAPI),主要用来提升性能。

  • UMat与Mat的最大不同在于,UMat尽可能地调用硬件现有的最好资源,如有GPU的情况下,就不使用CPU。所以一般情况下,可以达到加速的作用。

  • 仅当对图像做一些昂贵计算时,Transparent API效果才显著。因为,将图像移动到GPU中计算,这一过程本身也相当耗时的。

  • 第一次运行代码需要初始化硬件环境,所以UMat可能没有CPU的Mat运算快,但随后的计算就会快不少。

  • UMat.copyTo(Mat)很耗时,imshow(“UMat”,umat)时内部也要UMat.copyTo(Mat)把GPU的时间回传到CPU。

  • 因为UMat和Mat有着共同的基类InputOutputArray,所以大部分OpenCV的函数UMat都能使用,但是UMat自带的方法没有Mat丰富。比如说,UMat没有data指针指向数据,没有ptr<>方法。

UMat的使用方法:

Mat转UMat:
	方法1:
	    UMat img;
	    imread("image.jpg", 0).copyTo(img);
	方法2:   
		Mat mat = imread("image.jpg", 0); 
		UMat umat; 
		mat.copyTo(umat);
	方法3:
		Mat mat = imread("image.jpg", 0); 
		UMat umat = mat.getUMat( flag );//flag可取:ACCESS_READ, ACCESS_WRITE, ACCESS_RW and ACCESS_FAST
UMat转Mat:
	Mat mat = umat.getMat( flag );

官方给的Mat与UMat速度测试(C++ Demo):

#include "opencv2/opencv.hpp" 
using namespace cv;
int main(int argc, char** argv)

	// ******* No Transparent API(UMat) *******
	double mat_start  = static_cast<double>(getTickCount());
	Mat img, gray;
	img = imread(argv[1], IMREAD_COLOR);
 
	cvtColor(img, gray, CV_BGR2GRAY);
	GaussianBlur(gray, gray, Size(7,7), 1.5);
	Canny(gray, gray, 0, 50);
	std::cout << "Mat costs time: "<< static_cast<double>((getTickCount() - mat_start) / getTickFrequency()) << " s..."<< std::endl;
	imshow("edges", gray);
	//waitKey(0);
 
	// ******* Transparent API(UMat) *******
	double umat_start = static_cast<double>(getTickCount());
	UMat uimg, ugray;
	imread(argv[1], IMREAD_COLOR).copyTo(uimg);
	cvtColor(uimg, ugray, COLOR_BGR2GRAY);
	GaussianBlur(ugray, ugray, Size(7,7), 1.5);
	Canny(ugray, ugray, 0, 50);
	std::cout << "UMat costs time: " << static_cast<double>((getTickCount() - umat_start) / getTickFrequency()) << " s..." << std::endl;
	imshow("edges_UMat", ugray);
	waitKey(0);
	return 0;

  • 实际测试后发现,除过第一次运算,后面的运算UMat至少快小数点后一个零。

4. OCL Module 和 Transparent API的区别 ?

  • 在OpenCV3中,OCL module已经被舍弃。而是使用更易上手的Transparent API来替代 OCL module。因此只需要使用 UMat来替换Mat,而其余的代码保持不变,即可实现加速。

二、使用OpenCV小技巧

  • Opencv中32位和8位整形的运算时间大致相等---------所以用32位处理图像数据会更快。

三、Openmp的使用

假如我们有100万条数据,把们把它切割成10份,再开辟10个线程分别计算,其实是非常麻烦的,而它看起来是有套路的,我们有什么办法可以让编译器自动把一个串行的for循环这种代码转成一个多线程的并行代码呢, 这个时候就有一个工具,这个工具叫OpenMP (Open Multi-Processing)即共享存储并行计算。

  • Openmp适用于电脑里面有多个CPU,或多个核,我就可以让你的代码从串行计算自动转换为并行计算。它和我们用的线程不一样,它提供了对并行算法的高层抽象描述

Openmp的实质只是把我们手工切割线程这种过程给自动化了,但这种自动化方案的优点是它会自动根据你的CPU和比如循环次数、里面计算的量自动计算要产生多少个线程。比如有1万条数据,在八核电脑上开发,那就开八个线程,这样如果把程序放在另外一台电脑上,那台电脑是4个线程。如果我在那个四台电脑上开八个线程的话就会把速度拖慢。Openmp可以自动识别你的CPU的核数,到底是多少个并发,自动调节说创建多少个线程。当然,你也有一些方式去操纵它,比如限制最大线程数量。限制缓冲区大小,这些都是可以去限制的。

四、使用Qt小技巧

  • OpenCV中的图像主要存储在Mat类中,要让其显示在Qt的Label控件上,必须先将其转换为Qt的QImage类。Mat类图像是按照BGR顺序存储的图像,而QImage是按照RGB顺序存储的,在类型转换前需要将通道更改。
	srcImg = imread("00.jpg");
	cvtColor(srcImg, grayImg, CV_BGR2GRAY);

	Mat temp;
	QImage Qtemp;
	if (!isGray)
	
		cvtColor(srcImg, temp, CV_BGR2RGB);//BGR convert to RGB
		Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
	
	else
	
		cvtColor(grayImg, temp, CV_GRAY2RGB);//GRAY convert to RGB
		Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
	
	ui.label->setPixmap(QPixmap::fromImage(Qtemp));
	ui.label->resize(Qtemp.size());
	ui.label->show();

opencv&qt学习之四——opencv实现人脸检测与相关知识整理(代码片段)

...能够找到关于OpenCV人脸检测的例子也比较多,大多也都是基于这个例程来更改,只是多数使用的是OpenCV1.0的版本,而OpenCV2.0以后由于模块结构的更改,很多人并没有将例程 查看详情

图像二值化的指令集加速例子(代码片段)

以下代码基于VS2015、Qt5.9和OpenCV430,CPU型号是IntelCorei5-7400。功能是对图像进行二值化。下面直接上代码:voidmain()Matimage(1024,1024,CV_8UC1,Scalar(255));circle(image,Point2i(500,500),200,Scalar(0),-1);int64t1,t2;Matbinar1(image.size(),image.type());Matbinar2(image.... 查看详情

手动安装opencv下的ipp加速库(代码片段)

安装opencv的时候,往往会卡在这里:IPPICV:Download:ippicv_2019_lnx_intel64_general_20180723.tgz其实就是墙的原因,然后你去搜,解决方法就是先下载好,然后安装opencv的时候从本地载入。ippcv的下载地址其实就藏在ippcv.cmake文件(在opencv/3rdp... 查看详情

vs2015+opencv+qt(代码片段)

VS2015+OpenCV+Qt01.OpenCV下载进入官网链接:https://opencv.org,下载所需要的版本;下载完成后直接双击,选择解压路径,解压到响应的文件夹中;若之后需要把OpenCV的库配置到Qt中,则选择3.1.0或者3.0.0的版本,亲测可用添加环境变量一... 查看详情

qt+opencv实现人脸识别打卡系统2.0(代码片段)

一、简介人脸识别1.0版本:【QT】基于人脸识别的打卡系统(QT+Opencv+SQLite)--设计过程_Jason~shen的博客-CSDN博客_qt人脸识别目录使用平台设计目标功能描述设计方案数据库设计使用说明使用平台https://blog.csdn.net/qq_... 查看详情

基于opencv与qt的亚克力板件检测系统(代码片段)

...是也希望起到一个抛砖引玉的效果。源码下载链接:基于OpenCV与Qt的亚克力板件检测系统-图像处理文档类资源-CSDN下载一、概述首先是作业的要求:综上所述,我们需要实现的功能有:采集图像保存图像颜色识别... 查看详情

opencv和qt的开发环境配置(代码片段)

参考文档只需参考QT官方文档即可,版本要选择和文档中相同的,除了CMake可以使用最新的版本。软件下载源5.9Qt离线安装包,下载qt-opensource-windows-x86-5.9.6.exeOpenCV用文档中的下载地址CMake在官网下载 查看详情

opencv例程300篇242.加速稳健特征检测算法(surf)(代码片段)

『youcans的OpenCV例程300篇-总目录』【youcans的OpenCV例程300篇】242.加速稳健特征检测算法(SURF)加速稳健特征检测算法(SpeededUpRobustFeatures,SURF)是SIFT的改进算法,比SIFT更快更稳定,可以应用于实时的计... 查看详情

opencv例程300篇242.加速稳健特征检测算法(surf)(代码片段)

『youcans的OpenCV例程300篇-总目录』【youcans的OpenCV例程300篇】242.加速稳健特征检测算法(SURF)加速稳健特征检测算法(SpeededUpRobustFeatures,SURF)是SIFT的改进算法,比SIFT更快更稳定,可以应用于实时的计... 查看详情

opencv例程300篇242.加速稳健特征检测算法(surf)(代码片段)

『youcans的OpenCV例程300篇-总目录』【youcans的OpenCV例程300篇】242.加速稳健特征检测算法(SURF)加速稳健特征检测算法(SpeededUpRobustFeatures,SURF)是SIFT的改进算法,比SIFT更快更稳定,可以应用于实时的计... 查看详情

基于opencv的图像融合(代码片段)

 版本由于每个版本的代码偏差都比较大,这里是基于opencv3.4.5版本的开发https://github.com/opencv/opencv/releases/tag/3.4.5https://github.com/opencv/opencv_contrib/releases/tag/3.4.5编译命令:cmake-DOPENCV_ENABLE_NONFREE=ON-DBUILD_E 查看详情

qt+vs+opencv联合开发-创建第一个qt程序以及快捷键学习(代码片段)

QT简介什么是QT?QT是基于C++的,跨平台的应用程序开发框架QT跨平台的理解:跨平台是它最大的优点,跨平台使用的前提搭建好环境后,可以在不同系统中使用,例如在windows下设计好的界面和程序... 查看详情

opencv进阶-opencv4.4cuda加速(代码片段)

参考:OpenCV4.4CUDA编译与加速全解析OpenCV4.4+CUDA编译全解析#include<opencv2\\opencv.hpp>#include<opencv2\\cudaimgproc.hpp>usingnamespacecv;usingnamespacestd;usingnamespacecv::cuda;intmain() cu 查看详情

opencv学习_qt显示图片(代码片段)

opencv+qt1.opencv显示图片hpp三个主要函数imgInit():负责加载图片,转换格式等操作imgProc():负责对图片的处理和算法实现imgShow():负责在窗口显示图片#include"opencv2/opencv.hpp"usingnamespacecv;classMainWindow:pub 查看详情

opencv学习_qt显示图片(代码片段)

opencv+qt1.opencv显示图片hpp三个主要函数imgInit():负责加载图片,转换格式等操作imgProc():负责对图片的处理和算法实现imgShow():负责在窗口显示图片#include"opencv2/opencv.hpp"usingnamespacecv;classMainWindow:pub 查看详情

基于opencv图片切割(代码片段)

  基于opencv图片切割为n个3*3区块  工作原因,切割图片,任务急,暂留调通的源码,留以后用.packagecom.rosetta.image.test;importorg.opencv.core.Core;importorg.opencv.core.Mat;importorg.opencv.core.Rect;importorg.opencv.highgui.Highgui;/***@A 查看详情

qt软件开发-基于ffmpeg设计视频播放器-支持软解与硬解(代码片段)

一、前言在前一章里介绍了ffmpeg基本概念,完成了ffmpeg对视频软件解码并渲染,实现了基本播放器功能设计。这篇文章介绍ffmpeg硬件加速解码视频的流程,完成基本播放器设计。我这里开发视频播放器用到的环境介绍:ffmpeg版本... 查看详情

使用træf?k(traefik)来加速qt在线更新(代码片段)

简述在使用Qt的MaintenanceTool程序进行在线更新的时候遇到一个问题,就是访问download.qt.io实在太慢了,老是失败。所以想使用国内的镜像站来进行更新。使用Qt的镜像站方法也很简单,下载Update.xml和Update_orig.xml回来,然后修改里... 查看详情