From a17738e1545ff7dbef6398b8ec1eab93ab59c9a1 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期四, 30 六月 2022 19:14:47 +0800 Subject: [PATCH] '功能完善' --- ConsoleApplication/OpenCLExcuter.cpp | 138 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 136 insertions(+), 2 deletions(-) diff --git a/ConsoleApplication/OpenCLExcuter.cpp b/ConsoleApplication/OpenCLExcuter.cpp index 2df0471..5ca86a0 100644 --- a/ConsoleApplication/OpenCLExcuter.cpp +++ b/ConsoleApplication/OpenCLExcuter.cpp @@ -212,7 +212,7 @@ -void OpenCLExcuter::splitNum(unsigned char* img, int img_width, int img_height, int* pos, int pos_count, unsigned char* zero, int num_width,int num_height,int num_count, unsigned char* result) { +void OpenCLExcuter::splitL2Num(unsigned char* img, int img_width, int img_height, int* pos, int pos_count, unsigned char* zero, int num_width,int num_height,int num_count, unsigned char* result) { clock_t time_0 = clock(); kernel = clCreateKernel(program, "split_num", &error); @@ -355,7 +355,7 @@ -void OpenCLExcuter::splitRowData(unsigned char* imgs, int imgWidth, int imgHeight, int* rowIndexs, int lines, +void OpenCLExcuter::splitL2RowData(unsigned char* imgs, int imgWidth, int imgHeight, int* rowIndexs, int lines, int* result) { kernel = clCreateKernel(program, "splitRowData", &error); @@ -424,6 +424,79 @@ clReleaseMemObject(memObject3); } +void OpenCLExcuter::recognitionNotNum(unsigned char* imgs, int imgWidth, int imgHeight, int* rowIndexs,int colCount, int lines, + int* result) { + + clock_t time_1 = clock(); + + + kernel = clCreateKernel(program, "recognition_not_num", &error); + if (kernel == NULL) { + throw("Couldn't create kernel!\n"); + } + + + int inputSize = imgWidth * imgHeight; + int resultSize = lines * 2; + + + //创建缓存对象 + + cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, imgs, &error); + if (error < 0) { + throw("Creat memObject1 failed!\n"); + } + + cl_mem memObject2 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int) * lines * 4 * colCount, rowIndexs, &error); + if (error < 0) { + throw("Creat memObject2 failed!\n"); + } + + + cl_mem memObject3 = clCreateBuffer(context, CL_MEM_WRITE_ONLY, + sizeof(int) * resultSize, NULL, &error); + if (error < 0) { + throw("Creat memObject3 failed!\n"); + } + + + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 2, sizeof(int), &imgWidth); + error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject3); + + if (error != CL_SUCCESS) { + throw("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { resultSize }; + size_t localWorkSize[1] = { 1 }; + + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject3, CL_TRUE, 0, resultSize * sizeof(int), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw("Error reading result buffer!\n"); + } + + //printf("%d %d %d %d \n", result[0], result[1], result[2], result[3]); + + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + +} + void OpenCLExcuter::rgb2Gray(unsigned char* imgs, int imgWidth, int imgHeight, unsigned char* result) { @@ -485,6 +558,67 @@ } + +void OpenCLExcuter::rgba2Gray(unsigned char* imgs, int imgWidth, int imgHeight, + unsigned char* result) { + + kernel = clCreateKernel(program, "rgba2GrayImg", &error); + if (kernel == NULL) { + throw("Couldn't create kernel!\n"); + } + + + int inputSize = imgWidth * imgHeight * 4; + int resultSize = imgWidth * imgHeight; + + + //创建缓存对象 + + cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, imgs, &error); + if (error < 0) { + throw("Creat memObject1 failed!\n"); + } + + cl_mem memObject2 = clCreateBuffer(context, CL_MEM_WRITE_ONLY, + sizeof(uchar) * resultSize, NULL, &error); + if (error < 0) { + throw("Creat memObject2 failed!\n"); + } + + + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth); + error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2); + + if (error != CL_SUCCESS) { + throw("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { imgHeight }; + size_t localWorkSize[1] = { 1 }; + + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw("Error reading result buffer!\n"); + } + + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + +} + void OpenCLExcuter::destory() { //释放资源 clReleaseDevice(devices); -- Gitblit v1.8.0