1. 程式人生 > >OpenCV二維Mat陣列(二級指標)在CUDA中的使用

OpenCV二維Mat陣列(二級指標)在CUDA中的使用

#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>

using namespace cv;
using namespace std;
  
__global__ void addKernel(uchar **pSrcImg,  uchar* pDstImg, int imgW, int imgH)  
{  
    int
tidx = threadIdx.x + blockDim.x * blockIdx.x; int tidy = threadIdx.y + blockDim.y * blockIdx.y; if (tidx<imgW && tidy<imgH) { int idx=tidy*imgW+tidx; uchar lenaValue=pSrcImg[0][idx]; uchar moonValue=pSrcImg[1][idx]; pDstImg[idx]= uchar(0.5
*lenaValue+0.5*moonValue); } } int main() { //OpenCV讀取兩幅影象 Mat img[2]; img[0]=imread("data/lena.jpg", 0); img[1]=imread("data/moon.jpg", 0); int imgH=img[0].rows; int imgW=img[0].cols; //輸出影象 Mat dstImg=Mat::zeros(imgH, imgW, CV_8UC1); //主機指標 uchar **pImg=(uchar**)malloc
(sizeof(uchar*)*2); //輸入 二級指標 //裝置指標 uchar **pDevice;//輸入 二級指標 uchar *pDeviceData;//輸入 一級指標 uchar *pDstImgData;//輸出影象對應裝置指標 //分配GPU記憶體 cudaError err; //目標輸出影象分配GPU記憶體 err=cudaMalloc(&pDstImgData, imgW*imgH*sizeof(uchar)); //裝置二級指標分配GPU記憶體 err=cudaMalloc(&pDevice, sizeof(uchar*)*2); //裝置一級指標分配GPU記憶體 err=cudaMalloc(&pDeviceData, sizeof(uchar)*imgH*imgW*2); //關鍵:主機二級指標指向裝置一級指標位置,這樣才能使裝置的二級指標指向裝置的一級指標位置 for (int i=0; i<2; i++) { pImg[i]=pDeviceData+i*imgW*imgH; } //拷貝資料到GPU //拷貝主機二級指標中的元素到裝置二級指標指向的GPU位置 (這個二級指標中的元素是裝置中一級指標的地址) err=cudaMemcpy(pDevice, pImg, sizeof(uchar*)*2, cudaMemcpyHostToDevice); //拷貝影象資料(主機一級指標指向主機記憶體) 到 裝置一級指標指向的GPU記憶體中 err=cudaMemcpy(pDeviceData, img[0].data, sizeof(uchar)*imgH*imgW, cudaMemcpyHostToDevice); err=cudaMemcpy(pDeviceData+imgH*imgW, img[1].data, sizeof(uchar)*imgH*imgW, cudaMemcpyHostToDevice); //核函式實現lena圖和moon圖的簡單加權和 dim3 block(8, 8); dim3 grid( (imgW+block.x-1)/block.x, (imgH+block.y-1)/block.y); addKernel<<<grid, block>>>(pDevice, pDstImgData, imgW, imgH); cudaThreadSynchronize(); //拷貝輸出影象資料至主機,並寫入到本地 err=cudaMemcpy(dstImg.data, pDstImgData, imgW*imgH*sizeof(uchar), cudaMemcpyDeviceToHost); imwrite("data/synThsis.jpg", dstImg); }

相關推薦

OpenCVMat陣列二級指標CUDA的使用

#include <cuda_runtime.h> #include <device_launch_parameters.h> #include <opencv2\opencv.hpp> #include <iostream> #include <str

C語言指標函式指標陣列二級指標

int (*p[num])( char*,int,int ); int (*(*p)[num])(int a); 上一篇部落格最後的兩個例子的答案分別是:函式指標陣列,函式指標陣列的指標。 函式指標陣列指標和前面的陣列指標其實沒有太大區別。然後今天主要理一下函式指標陣

碼生成QRCode.js

結果 phone rec max andro javascrip user doc area 什麽是 QRCode.js? QRCode.js 是一個用於生成二維碼的 JavaScript 庫。主要是通過獲取 DOM 的標簽,再通過 HTML5 Canvas 繪制而成,不依

C語言 數組指針動態分配和釋放

i++ 進制 numbers 很多 print 算術 uil 換算 som C 二維數組(指針)動態分配和釋放 先明確下概念: 所謂32位處理器就是一次只能處理32位,也就是4個字節的數據,而64位處理器一次就能處理64位,即8個字節的數據。如果我們將總長128位的指令分別

動態規劃收集蘋果

平面上有N*M個格子,每個格子中放著一定數量的蘋果。你從左上角的格子開始,每一步只能向下走或是向右走,每次走到一個格子上就把格子裡的蘋果收集起來,這樣下去,你最多能收集到多少個蘋果 解這個問題與解其它的DP問題幾乎沒有什麼兩樣。第一步找到問題的“狀態”,第二步找到“狀態轉移方程”,然後基本上

生成碼功能js前端

生成二維碼需要引入qrcode.js和jquery.min.js <!DOCTYPE html> <head> <title>二維碼</title> <meta http-equiv="Content-Type" content=

支付寶PC端碼支付沙箱環境

一,準備工作 jar 獲取以下內容: 1,APPID 2,支付寶閘道器 3,公鑰 4,私鑰 5,支付寶錢包賬號密碼 支付寶開放平臺: https://openhome.alipay.com/platform/developerIndex.htm 在這裡根據

揹包 - 潛水員Codevs 5056

潛水員 描述 潛水員為了潛水要使用特殊裝備。他有一個帶兩種氣體的氣缸:一個為氮氣,一個為氧氣。讓潛水員下潛的深度需要各種數量的氧和氮。潛水員有一定數量的氣缸。每個氣缸都有重量和氣體容量。潛水員為了完成他的工作需要特定的氧和氮。他完成工作所需氣缸的總重最低限度是多少? 例如:潛水員有5

使用系統提供的AVFoundation 實現碼掃描帶動畫

注意這裡的掃描必須真機測試 模擬器上是看不出來效果的 #import "ViewController.h" #import <AVFoundation/AVFoundation.h> @interface ViewController ()<AVCa

技巧-字首和容斥

問題描述:給定一個n行m列的矩陣a。 之後有許多查詢,每個查詢包括i,j,u,v四個數字,其中(i,j)表示一個矩陣的左上角,(u,v)表示一個矩陣的右下角。輸出這次查詢的矩陣內的和。 方法:先用n*m的時間求出二維字首和,之後每次查詢都是o(1)的時間複雜度。 首先我們定

c語言指標做函式引數,使用指標地址二級指標在被調函式修改主調函式的指標

1.程式碼 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char *prive; int data; } T_

陣列二級指標的傳遞問題

再次看這篇文章,感覺說的好多都是廢話,在文章最前面補充一句話: “[]的優先順序高於*”,大家可以帶著這句話看下面的~~~ ======================== 再一次的見證了自己的基礎不牢靠。。。幸好發現得早,看見網上說,華為的一個面試題就考了這個方面的

Linux C程式設計---指標陣列簡析陣列、多級指標

講到指標和陣列,先給大家看一道例題: 題目:填空練習(指向指標的指標) 1.程式分析:      2.程式原始碼: main() { char *s[]={"man","woman","girl","boy","sister"}; char **q; int k; for(

返回一個整形陣列的最大子陣列的和隨機整形陣列

一、題目:返回一個二維整數陣列中的最大子陣列的和(隨機二維整形陣列) 二、課題要求: 輸入一個二維整形陣列,數組裡有正數也有負數; 二維陣列中連續的一個子矩陣組成一個子陣列,沒個子陣列都有一個和; 求所有子陣列的和的最大值,要求時間複雜度為O(n)。 三、結對程式設計要求: 兩人結對完成程式設計任

寫一個函式,使給定的一個陣列3×3轉置,即行列互換。

import java.util.Scanner; public class Main {     public static void main(String[] args) {       &n

返回一個整數陣列最大子陣列的和小組成員:侯誠超,滕達

小組成員:侯誠超,滕達   設計思想 1.設計視窗:使用了textbox,button,Label視窗控制元件 2.程式編輯:(1).先編寫txt匯入程式,確保txt檔案能匯入到文字框中              

返回一個整數陣列最大子陣列的和人結對

題目:返回一個二維整數陣列中最大子陣列的和 要求:1.輸入一個二維整型陣列,數組裡有正數也有負數。            2.二維陣列中連續的一個子矩陣組成一個子陣列,每個子陣列都有一個和。        

整形陣列的最大子陣列結對作業

題目:返回一個二維整數陣列中最大子陣列之和。 要求: 1.輸入一個二維整形陣列,數組裡有正有負。 2.二維陣列中連續的一個子矩陣 組成一個數組,每個子陣列都有一個和。 3.求所有子陣列的和的最大值。 結對程式設計要求 兩人結對完成程式設計任務。 一人負責程式分析,程式碼程式設計。 一

用c++求一個整數陣列最大子陣列之和結對作業

題目:返回一個二維整數陣列中最大子陣列之和。 要求: 1.輸入一個二維整形陣列,數組裡有正有負。 2.二維陣列中連續的一個子矩陣 組成一個數組,每個子陣列都有一個和。 3.求所有子陣列的和的最大值。 結對程式設計要求 兩人結對完成程式設計任務。 一人負責程式分析,程式碼程式設計。 一

YTUOJ——寫一個函式,使給定的一個陣列3×3轉置,即行列互換

題目描述 寫一個函式,使給定的一個二維陣列(3×3)轉置,即行列互換。 輸入 一個3x3的矩陣 輸出 轉置後的矩陣 樣例輸入 1 2 3 4 5 6 7 8 9 樣例輸出 1 4 7 2 5 8 3 6 9 答案 #include "iostream