關於cuda和opencv混合編譯之後的一些算法加速--求取灰度平均數值

今天就來說說關於使用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 ,夠快吧.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章