OpenCV CUDA模塊設備層-----在 GPU上高效地執行兩個uint類型值的最小值比較函數vmin2()

  • 操作系統:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 編程語言:C++11

算法描述

OpenCV 的CUDA模塊(cudev) 中的一個設備端內聯函數,用于在GPU上高效地執行兩個uint類型值的最小值比較。
該函數返回兩個無符號整數 a 和 b 中的較小值:

return (a < b) ? a : b;

函數原型

__device__ __forceinline__ uint cv::cudev::vmin2 	( 	uint  	a,uint  	b ) 		

參數

  • a uint 第一個無符號整數(通常表示像素值)
  • b uint 第二個無符號整數(另一個像素值或參考值)

返回值

返回 a 和 b 中較小的那個值,類型為 uint。

使用場景

這個函數常用于以下圖像/視頻處理任務中:

  • 圖像增強(如取最小鄰域值)
  • 構建自定義濾波器(如最小值濾波)
  • 多幀合成中的最小值投影(如去除高亮噪聲)
  • GPU 并行像素級比較與選擇操作

代碼

#include <opencv2/cudev.hpp>
#include <opencv2/cudev/util/simd_functions.hpp>using namespace cv::cudev;// CUDA kernel
template <typename T>
__global__ void computeMinKernel(const PtrStep<T> src1,const PtrStep<T> src2,PtrStep<T> dst,int width,int height)
{int x = blockIdx.x * blockDim.x + threadIdx.x;int y = blockIdx.y * blockDim.y + threadIdx.y;if (x < width && y < height) {uint a = static_cast<uint>(src1(y, x));uint b = static_cast<uint>(src2(y, x));dst(y, x) = static_cast<T>(vmin2(a, b));  // 取最小值}
}int main() {// 加載兩張圖像cv::Mat h_src1 = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/img0.jpg", cv::IMREAD_GRAYSCALE);cv::Mat h_src2 = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/img1.jpg", cv::IMREAD_GRAYSCALE);if (h_src1.empty() || h_src2.empty()) {std::cerr << "Failed to load images!" << std::endl;return -1;}// 上傳到 GPUcv::cuda::GpuMat d_src1, d_src2, d_min;d_src1.upload(h_src1);d_src2.upload(h_src2);d_min.create(h_src1.size(), h_src1.type());// 設置 kernel 參數dim3 block(16, 16);dim3 grid((d_src1.cols + block.x - 1) / block.x,(d_src1.rows + block.y - 1) / block.y);// 啟動 kernel(顯式指定模板參數 uchar)computeMinKernel<uchar><<<grid, block>>>(d_src1, d_src2, d_min, d_src1.cols, d_src1.rows);// 下載結果并顯示cv::Mat h_min;d_min.download(h_min);cv::imshow("Min Image", h_min);cv::waitKey(0);return 0;
}

運行結果

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87354.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87354.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87354.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Web3與傳統網絡安全模型對比:關鍵差異解析

隨著互聯網技術的飛速發展&#xff0c;Web3的概念逐漸成為人們關注的焦點。Web3代表著一個更加去中心化、安全和用戶友好的網絡環境。與傳統的網絡安全模型相比&#xff0c;Web3在多個方面展現出了其獨特的優勢和特點。本文將深入探討Web3與傳統網絡安全模型之間的關鍵差異。 …

FLAN:微調語言模型是 Zero-Shot 學習者

摘要 本文探討了一種簡單的方法來提升語言模型的零樣本學習能力。我們展示了指令微調——即在通過指令描述的數據集集合上對語言模型進行微調——能夠顯著提升模型在未見任務上的零樣本表現。 我們以一個擁有1370億參數的預訓練語言模型為基礎&#xff0c;在60多個通過自然語…

springboot中的事件發布和監聽

事件定義 創建一個自定義事件類 UserLoginEvent&#xff0c;繼承 ApplicationEvent&#xff0c;用于攜帶用戶登錄信息&#xff1a; import org.springframework.context.ApplicationEvent;public class UserLoginEvent extends ApplicationEvent { //關鍵點1&#xff1a;ext…

“開源雙軌架構+40億參數擴散Transformer——ComfyUI-OmniGen2本地部署教程:重塑多模態生成的效率邊界!

一、簡介 OmniGen2 是由北京智源研究院最新推出的一個強大、高效的開源多模態生成模型。與 OmniGen v1 不同&#xff0c;OmniGen2 具有兩種不同的文本和圖像模態解碼路徑&#xff0c;利用非共享參數和解耦的圖像分詞器。OmniGen2 在四個主要功能方面具有競爭力的性能&#xff…

Java的SpringAI+Deepseek大模型實戰之會話記憶

文章目錄 背景項目環境實現步驟第一步、定義會話存儲方式方式一、定義記憶存儲ChatMemory方式二、注入記憶存儲ChatMemory 第二步、配置會話記憶方式一、老版本實現方式二、新版本實現 第三步、存儲會話信息 異常處理1、InMemoryChatMemory 無法解析 背景 前兩期【環境搭建】和…

RDS MySQL vs. Aurora MySQL:高需求工作負載的終極遷移指南

在 AWS 上&#xff0c;開發團隊最常見且關鍵的決策之一就是選擇合適的關系型數據庫。通常&#xff0c;討論會從 RDS for MySQL 這個可靠且熟悉的“老黃牛”開始。但很快&#xff0c;就會有人提到一個更強大、更云原生的選項&#xff1a;Aurora MySQL。 也許&#xff0c;就像最…

使用倉頡編程語言是一種怎樣的體驗?

2024年6月21日下午&#xff0c;華為終端BG軟件部總裁龔體先生在華為開發者大會主題演講《鴻蒙原生應用&#xff0c;全新出發&#xff01;》中向全球開發者介紹了華為自研倉頡編程語言&#xff0c;并發布了HarmonyOS NEXT倉頡語言開發者預覽版。這是華為首次公開倉頡編程語言。 …

Qt Creator自定義控件開發流程

Qt Creator自定義控件開發流程 在 Qt 5.9 Creator 中開發自定義控件的完整流程如下&#xff0c;分為設計、實現、集成和測試四個階段&#xff1a; 1. 創建自定義控件類 (1) 新建類文件 右鍵項目 → 添加新文件 → C Class基類選擇 QWidget 或現有控件&#xff08;如 QPushBu…

翻譯《The Old New Thing》- 如何創建一個與屏幕大小相同的窗口,而不會被當作全屏窗口處理?

How can I create a window the size of the screen without it being treated as a fullscreen window? - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20250522-00/?p111211 問題描述 任務欄允許全屏窗口覆蓋它。這樣&#xff0c;當你在放映幻燈片或進行…

深分頁末日救星:MySQL延遲關聯原理與實戰手冊

MySQL 深分頁&#xff08;如 LIMIT 100000, 10&#xff09;本質是 高代價的偏移量掃描&#xff0c;可通過以下方案優化&#xff0c;附核心原理和實操示例&#xff1a; 一、深分頁為什么慢&#xff1f; SELECT * FROM orders ORDER BY id DESC LIMIT 100000, 10; 執行過程&…

前端技術棧 —— HTML、CSS和JavaScirpt執行環境

以下內容由GLM回答生成&#xff0c;不保證正確性。 前端技術棧 —— HTML、CSS和JavaScirpt執行環境 JavaScript 的執行環境HTML 和 CSS 的執行環境HTML 和 CSS 是否可以在其他環境中執行&#xff1f;總結 JavaScript 是一種 解釋型語言&#xff0c;但它也可以被編譯。JavaScr…

多項式帶余除法——線性代數題目為例

一、多項式帶余除法的定義 二、例題 使用方法將在例題中展示&#xff1a;

學習日記-spring-day40-7.3

知識點&#xff1a; 1.自動裝配Resource&#xff08;3&#xff09; 知識點 核心內容 重點 Autowired與Resource注入規則 默認注入邏輯&#xff1a;未指定參數時&#xff0c;Resource優先按屬性名匹配&#xff08;by name&#xff09;&#xff0c;失敗后按類型匹配&#xf…

重新認識JNIEnv

引言 拋開一堆概念&#xff0c;我們從本質出發。 java 調用c 我們開發移動端或者后端服務 &#xff0c;都是用的java 或者kotlin 語言。有時候我們需要用c的一些庫&#xff08;ocr識別/導航的算法/ 等&#xff09; 因為一些跟硬件相關的接口或者系統的api 都是c寫的。 C調用J…

人工智能訓練師——智能語音識別ASR

人機對話——ASR 概念 ASR&#xff08;Automatic Speech Recognition&#xff0c;自動語音識別&#xff09;是一種將人類語音轉換為文本的技術。它使得計算機能夠“聽”懂人類的語音指令或對話&#xff0c;并將其轉換成可讀、可編輯的文本形式。ASR技術是人機交互領域中的一個…

Compose 常用命令詳解——AI教你學Docker

3.3 Compose 常用命令詳解 Docker Compose 通過一系列命令高效管理多容器應用。理解這些命令&#xff0c;可以讓你靈活地啟動、停止、查看、調試、擴縮容和配置 Compose 項目。 一、核心命令詳解 1. docker compose up 功能&#xff1a;啟動并構建所有服務&#xff0c;生成網…

Mausezahn - 網絡流量生成與測試工具(支持從鏈路層到應用層的協議模擬)

Mausezahn 是一個 網絡流量生成與測試工具&#xff0c;主要用于模擬各種網絡協議行為、測試網絡設備性能、驗證安全策略或進行故障排查。它支持從底層鏈路層&#xff08;如 Ethernet、VLAN&#xff09;到高層應用層&#xff08;如 HTTP、DNS&#xff09;的協議模擬&#xff0c;…

08-three.js Textures

Three.js Journey — Learn WebGL with Three.jsThe ultimate Three.js course whether you are a beginner or a more advanced developerhttps://threejs-journey.com/?c=p3 使用原生 JavaScript 首先是靜態頁面的放置位置,如果使用Vite模版配置,可以直接放在 /static/ …

git 倉庫取消合并的分支

要取消 Git 倉庫中某次特定的分支合并(例如第一次合并),同時保留其他分支的合并,需要通過 Git 的版本控制功能來操作。以下是具體的步驟和方法,假設你想撤銷某次合并(例如某個提交),并確保其他合并不受影響: 背景假設 你有一個 Git 倉庫,主分支(例如 main)上已經合…

【從歷史數據分析英特爾該如何擺脫困境】

與大多數其他分析師不同&#xff0c;自2013年以來&#xff0c;筆者就一直在積極強調英特爾未來將遭遇冰山&#xff0c;最終我們預測英特爾將在試圖執行其之前的戰略時破產。盡管我們更愿意采用與英特爾不同的代工廠方法&#xff08;即與臺積電成立合資企業&#xff09;&#xf…