commit
3f83d7b263
3 changed files with 112 additions and 0 deletions
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
cmake_minimum_required(VERSION 3.20) |
||||
|
||||
project(app0 CUDA) |
||||
|
||||
add_executable(app0 main.cu) |
||||
|
||||
set(OpenCV_DIR "C:/Users/zara/Documents/opencvBuild/install") |
||||
find_package(OpenCV REQUIRED) |
||||
target_link_libraries(app0 ${OpenCV_LIBS}) |
@ -0,0 +1,101 @@
@@ -0,0 +1,101 @@
|
||||
#include <opencv2/opencv.hpp> |
||||
#include <iostream> |
||||
#include <cuda.h> |
||||
|
||||
__device__ int index() |
||||
{ |
||||
int i = threadIdx.x + blockDim.x * (threadIdx.y + blockDim.y * (threadIdx.z + blockDim.z * (blockIdx.x + gridDim.x * (blockIdx.y + gridDim.y * (blockIdx.z))))); |
||||
return i; |
||||
} |
||||
|
||||
__global__ void cudaAvgKernel(unsigned char *src, unsigned char *dst, int rows, int cols, int r) |
||||
{ |
||||
int i = index(); |
||||
int row = i / cols; |
||||
int col = i % cols; |
||||
|
||||
int rs = row - r; |
||||
int re = row + r + 1; |
||||
int cs = col - r; |
||||
int ce = col + r + 1; |
||||
|
||||
if (rs < 0) |
||||
{ |
||||
rs = 0; |
||||
} |
||||
if (cs < 0) |
||||
{ |
||||
cs = 0; |
||||
} |
||||
if (re > rows) |
||||
{ |
||||
re = rows; |
||||
} |
||||
if (ce > cols) |
||||
{ |
||||
ce = cols; |
||||
} |
||||
|
||||
int s = 0; |
||||
for (int r = rs; r < re; r++) |
||||
{ |
||||
for (int c = cs; c < ce; c++) |
||||
{ |
||||
s += src[rs * cols + c]; |
||||
} |
||||
} |
||||
if (i < rows * cols) |
||||
{ |
||||
dst[i] = s / (re - rs) / (ce - cs); |
||||
} |
||||
} |
||||
|
||||
int main() |
||||
{ |
||||
cv::VideoCapture cap(0); |
||||
cv::Mat image; |
||||
cv::Mat gray; |
||||
cv::Mat dst; |
||||
while (true) |
||||
{ |
||||
cap.read(image); |
||||
cv::cvtColor(image, gray, cv::COLOR_RGB2GRAY); |
||||
dst = gray.clone(); |
||||
|
||||
unsigned char *srcGpu; |
||||
unsigned char *dstGpu; |
||||
cudaError_t err = cudaGetLastError(); |
||||
|
||||
cudaMalloc(&srcGpu, gray.cols * gray.rows * 2); |
||||
err = cudaGetLastError(); |
||||
std::cout << "1 err code =" << err << ", msg = " << cudaGetErrorString(err) << std::endl; |
||||
cudaMalloc(&dstGpu, gray.cols * gray.rows * 2); |
||||
err = cudaGetLastError(); |
||||
std::cout << "2 err code =" << err << ", msg = " << cudaGetErrorString(err) << std::endl; |
||||
std::cout << "srcgpu = " << (int)srcGpu << ", dstgpu = " << (int)dstGpu << std::endl; |
||||
std::cout << "gray.data index = " << (int)gray.data << std::endl; |
||||
cudaMemcpy(srcGpu, gray.data, gray.rows * gray.cols, cudaMemcpyHostToDevice); |
||||
err = cudaGetLastError(); |
||||
std::cout << "3 err code =" << err << ", msg = " << cudaGetErrorString(err) << std::endl; |
||||
|
||||
cudaAvgKernel<<<gray.rows, gray.cols>>>(srcGpu, dstGpu, gray.rows, gray.cols, 5); |
||||
err = cudaGetLastError(); |
||||
std::cout << "4 err code =" << err << ", msg = " << cudaGetErrorString(err) << std::endl; |
||||
cudaDeviceSynchronize(); |
||||
cudaMemcpy(dst.data, dstGpu, gray.rows * gray.cols, cudaMemcpyDeviceToHost); |
||||
|
||||
cv::imshow("default", gray); |
||||
cv::imshow("mirror", dst); |
||||
cudaFree(srcGpu); |
||||
cudaFree(dstGpu); |
||||
|
||||
if (cv::waitKey(20) == 'q') |
||||
{ |
||||
break; |
||||
} |
||||
} |
||||
|
||||
image.release(); |
||||
cap.release(); |
||||
return 0; |
||||
} |
Loading…
Reference in new issue