17 #include <cuda_runtime.h> 18 #include <cuda_gl_interop.h> 20 #include <helper_cuda.h> 21 #include <helper_cuda_gl.h> 23 #include <helper_functions.h> 24 #include <rendercheck_gl.h> 27 #include <opencv2/imgproc/imgproc.hpp> 28 #include <opencv2/core/core.hpp> 29 #include <opencv2/highgui/highgui.hpp> 30 #include <opencv2/gpu/gpu.hpp> 31 #include <opencv2/gpu/gpumat.hpp> 70 extern "C" __declspec(dllexport) int UploadImToTexture(
void* fboColorTex2,
int width,
int height,
void* image,
int align,
int widthStep,
int channels)
75 GLuint fboColorTex = (GLuint) (
size_t) fboColorTex2;
77 glBindTexture(GL_TEXTURE_2D, fboColorTex);
78 glPixelStorei (GL_UNPACK_ALIGNMENT, align);
79 glPixelStorei (GL_UNPACK_ROW_LENGTH, widthStep / channels);
80 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
81 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
83 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, 640, 240, 0, GL_BGR, GL_UNSIGNED_BYTE, image);
90 extern "C" __declspec(dllexport) int* CudaEdgeLikelihood(
int height,
int width,
void* ID [200],
void* ID_real,
void* image,
int align,
int widthStep,
int channels)
92 int * likelihood =
new int[200];
93 extern void BindToTexture( cudaArray *cuArr );
94 extern void BindToTextureGray( cudaArray *cuArr );
95 extern void DeviceArrayCopyFromTexture( float3* dst,
int dstStep,
int width,
int height );
101 float sum, nonZero, zero;
107 struct cudaGraphicsResource *cuda_tex_screen_resource;
108 cv::gpu::GpuMat gpuMat(height,width, CV_32FC3 );
109 cv::gpu::GpuMat GgpuMat(height,width, CV_32FC1 );
112 GLuint gltex_R = (GLuint)(
size_t)(ID_real);
113 struct cudaGraphicsResource *cuda_tex_screen_resource_R;
114 cv::gpu::GpuMat gpuMat_R(height,width, CV_32FC3 );
115 cv::gpu::GpuMat GgpuMat_R(height,width, CV_32FC1 );
119 cv::gpu::GpuMat GpuMatMul(height,width, CV_32FC1);
123 glBindTexture (GL_TEXTURE_2D, gltex_R);
124 glBindTexture(GL_TEXTURE_2D, gltex_R);
125 glPixelStorei (GL_UNPACK_ALIGNMENT, align);
126 glPixelStorei (GL_UNPACK_ROW_LENGTH, widthStep / channels);
127 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
128 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
130 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, 640, 240, 0, GL_BGR, GL_UNSIGNED_BYTE, image);
132 checkCudaErrors( cudaGraphicsGLRegisterImage( &cuda_tex_screen_resource_R, gltex_R, GL_TEXTURE_2D, cudaGraphicsMapFlagsReadOnly ) );
135 checkCudaErrors( cudaGraphicsMapResources( 1, &cuda_tex_screen_resource_R, 0 ) );
136 checkCudaErrors( cudaGraphicsSubResourceGetMappedArray( &cuArr_R, cuda_tex_screen_resource_R, 0, 0 ) );
138 BindToTexture( cuArr_R );
140 DeviceArrayCopyFromTexture( (float3*)gpuMat_R.data, gpuMat_R.step, gpuMat_R.cols, gpuMat_R.rows );
142 checkCudaErrors( cudaGraphicsUnmapResources( 1, &cuda_tex_screen_resource_R, 0 ) );
143 checkCudaErrors( cudaGraphicsUnregisterResource(cuda_tex_screen_resource_R));
145 cv::gpu::cvtColor(gpuMat_R,GgpuMat_R,CV_RGB2GRAY);
149 for(
int i=0;i<200;i++)
151 gltex = (GLuint)(
size_t)(ID[i]);
152 glBindTexture (GL_TEXTURE_2D, gltex);
153 GLint width,height,internalFormat;
154 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPONENTS, &internalFormat);
155 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
156 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
158 checkCudaErrors( cudaGraphicsGLRegisterImage( &cuda_tex_screen_resource, gltex, GL_TEXTURE_2D, cudaGraphicsMapFlagsReadOnly ) );
160 checkCudaErrors( cudaGraphicsMapResources( 1, &cuda_tex_screen_resource, 0 ) );
161 checkCudaErrors( cudaGraphicsSubResourceGetMappedArray( &cuArr, cuda_tex_screen_resource, 0, 0 ) );
162 BindToTexture( cuArr );
164 DeviceArrayCopyFromTexture( (float3*)gpuMat.data, gpuMat.step, gpuMat.cols, gpuMat.rows );
166 checkCudaErrors( cudaGraphicsUnmapResources( 1, &cuda_tex_screen_resource, 0 ) );
167 checkCudaErrors( cudaGraphicsUnregisterResource(cuda_tex_screen_resource));
168 cv::gpu::cvtColor(gpuMat,GgpuMat,CV_RGB2GRAY);
173 cv::gpu::multiply(GgpuMat,GgpuMat_R,GpuMatMul);
174 cv::Scalar sumS = cv::gpu::sum(GpuMatMul);
181 sum = sumS[0]*lambdaEdge;
182 nonZero = (float) cv::gpu::countNonZero(GgpuMat);
185 likelihood[i] = 0.000000001;
189 result = sum/nonZero;
190 likelihood[i] = (int)((cv::exp(-result)) *1000);