今天就來說說關於使用opencv 使用cuda加速的版本吧,來做一點記錄,免的以後忘記了
下載opnecv4.10板本和contrib4.10版本,使用cmke編譯,這裏注意 opencv選項中,擴展的路勁,以及勾選 WITH_CUDA 這個選項,不然編譯之後的DLL,沒有cuda版本的,
大約是這些個樣子的,這裏附上我編譯之後的lib include 文件.的百度雲鏈接,可以直接下載
鏈接: https://pan.baidu.com/s/1To-HtiZl0dJvnSxGEcclsw 提取碼: kvas
貌似有點大.
在將lib 以及 .h等頭文件配置好項目中後,我們直接使用,下面是一些效果圖,加速效果明顯,上面的時間單位i是ms,速度很快
//這是一段獲取圖像平均數值的代碼.下面詳細介紹.
double getAvg_gpu(cv::Mat &img)
{
//創建gpumat結構,這個數據結構是專門在PGU 上做的運算,
cv::cuda::GpuMat gray;
cv::cuda::GpuMat source;
cv::Mat dst;
long controlnubers = 0;
//判斷通道數目
if (img.channels() == 3)
{
//將cv::mat結構的數據,放入GpuMat結構中,其實就是cuda中的 cudaMalloc 和 cudaMemcpy 的結合,//但//是,這裏的gpumat結構,在生命週期結束後,會自動釋放gpu內存,而我們使用cuda加速的時候,卻需要自動釋放
source.upload(img);
//這個是cv裏面自動加速的算法,我們直接主動調用.這裏有個細節,CV_BGR2GRAY 注意,這裏BGR的順序,否則,提取一個像素的RGB的時候,其R和B是反的.
cv::cuda::cvtColor(source, gray,CV_BGR2GRAY);
//這裏將處理過之後的數據,從gpuMat結構中,轉化爲 Mat結構.
gray.download(dst);
//這裏使用了mat中的一個算法,求取均值
Scalar scalar = cv::mean(dst);
qDebug() << "channels: " << img.channels();
//這個返回的數值,就是我們獲取到的圖像的平均數值.:這裏的這個均值,經過我測試,是採用的0.299*R + 0.587*g + 0.144*B = gray 這個算法,累加平均之後的數值.這裏就不演示了.
return scalar.val[0];
}
else if(img.channels() == 1)
{
Scalar scalar = cv::mean(dst);
return scalar.val[0];
}
return 0;
}
//基本上的套路就是這個
//測試一下代碼.
void main()
{
cv::Mat gray_r = imread("image\\group_7.bmp");
if (gray_r.data == nullptr)
{
qDebug() << "read image failed";
return ;
}
double avgNumber = getAvg_gpu(gray_r );
qDebug() << QStringLiteral("gpu獲取的圖像均值: %1 ").arg(avgNumber);
}
這個經過加速,我測試的時間是0.05ms ,夠快吧.