OpenCV算法加速(5)官方G-API加速效果如何?怎么使用?

本文介绍了OpenCV的G-API框架,它通过构建计算图来优化图像处理算法,如Canny边缘检测和findContours轮廓提取。作者对比了传统方法与G-API实现的性能,结果显示G-API能显著提升处理速度。测试中,Canny和findContours的运行时间分别减少了约27%和12%。官方测试用例和参考文献提供了更多关于G-API的信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、G-API是什么?能干什么? 

G-API 是OpenCV针对图像处理算法流程开发的目标是以构建图为方法,增加不同后端进行计算优化,以使图像处理任务更加轻量级和快速的新框架。比如整体考虑GPU上的算法流程、系统减少优化显存访问,可有效提高计算速度。

2、笔者使用的是opencv v4.5.5版本源码,

https://github.com/opencv/opencv/tree/4.5.5/modules/gapi

自己写了一个demo来测试canny和findContours算子的性能,电脑CPU 4核,8线程,内存8GB:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/gapi/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>

void normal()
{
    cv::Mat srcImage = cv::imread("D:\\allike\\Image_20210707220756198.jpg");
    cv::Mat dstImage;
    std::vector<std::vector<cv::Point>> vvtPointContours; //类型不能是cv::Point2f,否则会出错,提示matrix_wrap.cpp:1385: error

    double t1 = (double)cv::getTickCount();

    cv::cvtColor(srcImage, dstImage, cv::COLOR_BGR2GRAY);
    cv::blur(dstImage, dstImage, cv::Size(5, 5));
    cv::Canny(dstImage, dstImage, 20, 100, 3);

    double t2 = ((double)cv::getTickCount() - t1) / cv::getTickFrequency() * 1000;
    std::cout << "Run Time 1,Canny: " << t2 << " ms\n";

    t2 = (double)cv::getTickCount();

    cv::findContours(dstImage, vvtPointContours, cv::RETR_LIST, cv::CHAIN_APPROX_NONE, cv::Point(0, 0));

    double t3 = ((double)cv::getTickCount() - t2) / cv::getTickFrequency() * 1000;
    std::cout << "Run Time 1,findContours: " << t3 << " ms\n";
}

void gapi()
{
    cv::Mat srcImage = cv::imread("D:\\allike\\Image_20210707220756198.jpg");
    cv::Mat dstImage;

    //G-API只追踪管线的操作以及如何连接的。G-API的数据对象(cv::GMat)是用以连接各种操作的。
    //cv::GMat in则是一个为空的GMat信号,用于告知计算的开始。
    //然后实例化cv::GComputation这个对象。此对象把输入/输出(input/output)数据当做参数(在本例中依次是in和out这两个cv::GMat对象),
    //并基于in和out的中的数据流来重建调用图。
    double t1 = (double)cv::getTickCount();

    //https://github.com/opencv/opencv/tree/4.5.5/modules/gapi/samples
    cv::GMat in;
    cv::GMat gray = cv::gapi::BGR2Gray(in);
    cv::GMat imgBlur = cv::gapi::blur(gray, cv::Size(5, 5));
    cv::GMat out = cv::gapi::Canny(imgBlur, 20, 100, 3);
    cv::GComputation ac(in, out);
    ac.apply(srcImage, dstImage);

    double t2 = ((double)cv::getTickCount() - t1) / cv::getTickFrequency() * 1000;
    std::cout << "Run Time 2,Canny: " << t2 << " ms\n";

    t2 = (double)cv::getTickCount();

    //https://github.com/opencv/opencv/tree/4.5.5/modules/gapi/test/common
    //https://github.com/opencv/opencv/tree/4.5.5/modules/gapi/test/common/gapi_imgproc_tests_common.hpp
    std::vector<std::vector<cv::Point>> out_cnts_gapi;
    cv::Point offset = cv::Point();
    cv::GMat g_in;
    cv::GOpaque<cv::Point> gOffset;
    cv::GArray<cv::GArray<cv::Point>> outCts = cv::gapi::findContours(g_in, cv::RETR_LIST, cv::CHAIN_APPROX_NONE, gOffset);
    cv::GComputation c(GIn(g_in, gOffset), GOut(outCts));
    c.apply(gin(dstImage, offset), gout(out_cnts_gapi));

    double t3 = ((double)cv::getTickCount() - t2) / cv::getTickFrequency() * 1000;
    std::cout << "Run Time 2,findContours: " << t3 << " ms\n";

    cv::namedWindow("gapi", cv::WINDOW_NORMAL);
    //cv::imshow("gapi", dstImage);
    //cv::waitKey(0);
}

int main(int argc, char *argv[])
{
    normal();
    gapi();
    return 0;
}

测试结果:

Run Time 1,Canny: 120.699 ms
Run Time 1,findContours: 52.0882 ms
Run Time 2,Canny: 94.1655 ms
Run Time 2,findContours: 45.5371 ms

加速效果还是有一些的!

3、官方测试用例

https://github.com/opencv/opencv/tree/4.5.5/modules/gapi/test/common

https://github.com/opencv/opencv/tree/4.5.5/modules/gapi/samples

4、参考文献

OpenCV Graph API初体验 - 简书OpenCV Graph API (G-API) Introduction: OpenCV的Graph API(或称G-API)是一个让常规图像处理变得更快(fast)和轻量...https://www.jianshu.com/p/8c8c08496a2c

<think>好的,用户的问题是如何在图形界面或图像处理中实现透明效果。我需要结合提供的引用内容来回答这个问题。 首先,用户提到的引用[1]提到了透明图像处理的关键知识点,包括Alpha通道、混合模式、图像库API、CSS3/HTML5等。这说明实现透明效果可以通过这些方法。引用[2]和引用[3]涉及Java GUI中的paint方法和事件监听,可能和如何在Java中绘制透明组件有关。 接下来,我需要分步骤整理实现透明效果的常见方法。Alpha通道是基础,每个像素的透明度由Alpha值控制,这在图像处理中很常见。然后是混合模式,比如使用Alpha合成来混合颜色。在图形界面开发中,像Java的Swing可能需要设置组件的透明度属性,或者重写paint方法时处理透明度。引用[2]提到的paint方法可以用来自定义绘制,结合Alpha值实现透明效果。 另外,引用[1]还提到CSS3和HTML5,所以在网页中可以通过CSS的opacity属性或RGBA颜色来实现透明。性能优化方面,可能需要使用硬件加速或预乘Alpha,这些也属于引用[1]中的内容。 还要考虑用户可能的应用场景,比如GUI组件、网页元素或游戏中的透明效果。需要确保回答覆盖不同平台和方法,并引用相关的引用内容。例如,在Java GUI中实现透明,可能需要引用[2]和[3]中的事件监听和paint方法。 最后,生成相关问题时要围绕透明效果的技术、优化、应用场景等方面提问,帮助用户进一步了解。</think>### 如何在图形界面或图像处理中实现透明效果? 透明效果的实现依赖于**Alpha通道**和**颜色混合算法**,具体方法因应用场景而异。以下是几种常见实现方式: --- #### 1. **Alpha通道与颜色混合** - **原理**:每个像素的颜色值包含RGBA四个分量,其中A(Alpha)表示透明度(0为完全透明,1为完全不透明)。混合时使用公式: $$ C_{\text{最终}} = C_{\text{前景}} \times \alpha + C_{\text{背景}} \times (1 - \alpha) $$ - **应用**: - **图像处理**:通过图像库(如OpenCV、PIL)直接操作Alpha通道,例如使用Python的PIL库: ```python from PIL import Image img = Image.open("image.png").convert("RGBA") img.putalpha(128) # 设置透明度为50% img.save("transparent_image.png") ``` - **图形界面**:在Java Swing中,可通过`setBackground(new Color(r, g, b, alpha))`设置组件透明度[^2]。 --- #### 2. **图形界面中的透明组件** - **Java GUI(Swing/AWT)**: - 重写`paint()`方法时,使用带Alpha值的颜色绘制图形: ```java public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); // 设置50%透明度 g2d.setColor(Color.BLUE); g2d.fillRect(50, 50, 100, 100); } ``` - 使用`JComponent.setOpaque(false)`使组件背景透明[^2]。 - **网页(CSS3/HTML5)**: - 通过`opacity`属性或`rgba()`颜色函数: ```css .transparent-box { background-color: rgba(255, 0, 0, 0.3); /* 红色,30%透明度 */ opacity: 0.7; /* 整体透明度70% */ } ``` --- #### 3. **性能优化与高级效果** - **预乘Alpha(Premultiplied Alpha)**:将RGB分量预先乘以Alpha值,减少混合时的计算量[^1]。 - **硬件加速**:在游戏或高性能场景中,使用GPU加速的混合模式(如OpenGL的`glBlendFunc`)。 - **分层渲染**:将透明元素与非透明元素分层处理,避免频繁重绘背景。 --- #### 4. **透明效果的交互实现** - **事件穿透**:在透明区域允许鼠标事件传递到底层组件(如Java中实现`MouseListener`并判断点击位置透明度)[^3]。 - **动态透明度**:通过动画或用户交互实时调整Alpha值,例如实现渐变消失效果---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值