- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
對一個 uchar 類型的像素值(范圍 [0, 255]),先歸一化到浮點范圍 [0.0, 1.0],然后計算其反正弦值 asin(x),最終返回一個 float1 類型的結果。
函數原型
__device__ __forceinline__ float1 cv::cudev::asin ( const uchar1 & a )
參數
- uchar1 CUDA 向量類型,表示一個單通道的 8 位無符號整型(等價于 unsigned char 或 uint8_t)。
代碼示例
#include <opencv2/opencv.hpp>
#include <opencv2/cudev/common.hpp>
#include <opencv2/cudev/functional/functional.hpp>
#include <opencv2/cudev/util/vec_math.hpp>__global__
void apply_asin_kernel(const uchar* input, float* output, 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)return;int idx = y * width + x;uchar raw_value = input[idx];float normalized = raw_value / 255.0f;// 確保在定義域內if (normalized < -1.0f) normalized = -1.0f;if (normalized > 1.0f) normalized = 1.0f;output[idx] = asinf(normalized);
}int main() {// 創建測試圖像(uchar類型,單通道)cv::Mat h_img = cv::Mat::zeros(480, 640, CV_8UC1);cv::randu(h_img, cv::Scalar::all(0), cv::Scalar::all(255));// 將輸入上傳到設備cv::cuda::GpuMat d_img;d_img.upload(h_img);// 創建輸出設備內存(float1)cv::cuda::GpuMat d_out;d_out.create(d_img.size(), CV_32FC1);// 獲取原始指針const uchar* d_input = d_img.ptr<uchar>();float* d_output = d_out.ptr<float>();// 設置 CUDA 線程塊大小dim3 blockSize(16, 16);dim3 gridSize((d_img.cols + blockSize.x - 1) / blockSize.x,(d_img.rows + blockSize.y - 1) / blockSize.y);// 啟動核函數apply_asin_kernel<<<gridSize, blockSize>>>(d_input, d_output, d_img.cols, d_img.rows);// 下載結果到主機cv::Mat h_out;d_out.download(h_out);// 顯示部分結果std::cout << "First pixel (uchar): " << (int)h_img.at<uchar>(0, 0) << std::endl;std::cout << "After asin (float): " << h_out.at<float>(0, 0) << std::endl;return 0;
}
運行結果
First pixel (uchar): 91
After asin (float): 0.364907