利用OpenCL對OpenCV並行化心得(1)

2021-06-09 03:42:27 字數 973 閱讀 7967

做了一年多的opencv並行化,總算小有成就了

opencv裡面最重要的一種型別恐怕非8uc1莫屬,灰度圖一般都用這種型別表示,而且大多數演算法只提供這種資料型別的支援,所以8uc1的優化就成了整個工作的重中之重。以matrix add為例,最簡單的kernel的寫法是這樣的

__kernel void matrix_add(__global uchar* src1,__global uchar* src2, __global uchar* dst, int rows, int cols,int src1_step,int src2_step,int dst_step)

int x=get_global_id(0);

int y=get_global_id(1);

if(xdst[mad24(y,dst_step,x)]=src1[mad24(y,src1t_step,x)]+src2[mad24(y,src2_step,x)];

這種寫法非常簡潔,但是不夠高效,沒有充分利用gpu的記憶體頻寬,存在很大的浪費,為了充分利用gpu的記憶體頻寬,至少每次要寫出4byte,所以kernel就變成這樣

__kernel void matrix_add(__global uchar* src1,__global uchar* src2, __global uchar* dst, int rows, int cols,int src1_step,int src2_step,int dst_step)

int x=get_global_id(0)<<2;

int y=get_global_id(1);

if(x*(__global ucha4*)(dst+mad24(y,dst_step,x))=*(__global ucha4*)(src1+mad24(y,src1t_step,x))+*(__global ucha4*)(src2+mad24(y,src2_step,x));

這樣效率會提高四倍左右,但是可以這樣寫的前提是沒有roi問題,如果有roi情況會複雜很多

利用anaconda安裝OpenCV

然後一步步安裝,簡單入門教程 利用anaconda安裝opencv 開啟anaconda prompt 在此終端中進行換源,切換到清華的映象源 conda config add channels conda config add channels conda config set show chan...

利用OpenCV提取目標輪廓

乙個簡單的提取飛機目標影象 二值圖 輪廓的程式 include include include include iplimage g image null iplimage g gray null int g thresh 100 cvmemstorage g storage null char n...

利用opencv檢測出矩形

pragma once include troot.h include cbintoprofile.h include th1.h include cbmpdiff.h include ccircletopeak.h include ccolorcut.h include ccubicbspline...