From eda1a611bc4afcf1c36a6c728f432aec1f688e1b Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期一, 27 六月 2022 19:13:36 +0800 Subject: [PATCH] 'GP代码识别' --- ConsoleApplication/OpenCLExcuter.cpp | 47 +++++++++++++++++++++++++++-------------------- 1 files changed, 27 insertions(+), 20 deletions(-) diff --git a/ConsoleApplication/OpenCLExcuter.cpp b/ConsoleApplication/OpenCLExcuter.cpp index d94176c..2df0471 100644 --- a/ConsoleApplication/OpenCLExcuter.cpp +++ b/ConsoleApplication/OpenCLExcuter.cpp @@ -62,13 +62,13 @@ } -unsigned char** OpenCLExcuter::recognition_numbers(unsigned char* data, unsigned char* b_in, const int rows, const int cols) throw(std::string) { +unsigned char** OpenCLExcuter::recognition_numbers(unsigned char* data, unsigned char* b_in, const int rows, const int cols,const int num_width, const int num_height, const int num_count) throw(std::string) { //----------程序正文开始--------- auto startexectime = std::chrono::steady_clock::now(); - const int resultSize = rows * cols / (5 * 8); + const int resultSize = rows * cols / (num_width * num_height); const int inputSize = rows * cols; //创建内核 - kernel = clCreateKernel(program, "test1", &error); + kernel = clCreateKernel(program, "recognition_numbers_1", &error); if (kernel == NULL) { throw("Couldn't create kernel!\n"); } @@ -92,12 +92,15 @@ throw("Creat memObject4 failed!\n"); } - int width = cols / 5; + int width = cols / num_width; //设置内核参数 error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); error |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); error |= clSetKernelArg(kernel, 2, sizeof(int), &width); - error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject4); + error |= clSetKernelArg(kernel, 3, sizeof(int), &num_width); + error |= clSetKernelArg(kernel, 4, sizeof(int), &num_height); + error |= clSetKernelArg(kernel, 5, sizeof(int), &num_count); + error |= clSetKernelArg(kernel, 6, sizeof(cl_mem), &memObject4); if (error != CL_SUCCESS) { throw("Error setting kernel arguments!\n"); } @@ -134,7 +137,7 @@ int resultSize2 = resultSize / 10; unsigned char* result2 = (unsigned char*)malloc(sizeof(unsigned char) * resultSize2); - kernel = clCreateKernel(program, "test2", &error); + kernel = clCreateKernel(program, "recognition_numbers_2", &error); if (kernel == NULL) { throw("Couldn't create kernel!\n"); } @@ -191,8 +194,8 @@ clReleaseMemObject(memObject22); //复制最后的计算结果 - int fcol = 17; - int frow = rows / 8; + int fcol = num_count; + int frow = rows / num_height; unsigned char** fresult = (unsigned char**)malloc(sizeof(unsigned char*) * frow); for (int r = 0; r < frow; r++) { @@ -209,17 +212,17 @@ -void OpenCLExcuter::splitNum(unsigned char* img, int img_width, int img_height, int* pos, int pos_count, unsigned char* zero, unsigned char* result) { +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) { clock_t time_0 = clock(); - kernel = clCreateKernel(program, "test4", &error); + kernel = clCreateKernel(program, "split_num", &error); if (kernel == NULL) { throw("Couldn't create kernel!\n"); } int inputSize = (img_width * img_height); - int resultSize = (pos_count / 3) * (17 * 5 * 8 * 10); + int resultSize = (pos_count / 3) * (num_count * num_width * num_height * 10); //创建缓存对象 @@ -236,7 +239,7 @@ } cl_mem memObject3 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, - sizeof(unsigned char) * 5 * 8, zero, &error); + sizeof(unsigned char) * num_width * num_height, zero, &error); if (error < 0) { throw("Creat memObject3 failed!\n"); } @@ -252,7 +255,10 @@ error |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject3); error |= clSetKernelArg(kernel, 3, sizeof(int), &img_width); - error |= clSetKernelArg(kernel, 4, sizeof(cl_mem), &memObject4); + error |= clSetKernelArg(kernel, 4, sizeof(int), &num_width); + error |= clSetKernelArg(kernel, 5, sizeof(int), &num_height); + error |= clSetKernelArg(kernel, 6, sizeof(int), &num_count); + error |= clSetKernelArg(kernel, 7, sizeof(cl_mem), &memObject4); if (error != CL_SUCCESS) { throw("Error setting kernel arguments!\n"); } @@ -287,20 +293,20 @@ -void OpenCLExcuter::createNumberTemplates(int lines, unsigned char* result) { +void OpenCLExcuter::createNumberTemplates(int lines,int num_width,int num_height,int num_count, uchar* numsOneLevelData, unsigned char* result) { kernel = clCreateKernel(program, "createTemplateNumbers", &error); if (kernel == NULL) { throw("Couldn't create kernel!\n"); } - int inputSize = ImgUtil::NUM_HEIGHT * ImgUtil::NUM_WIDTH * 10; - int resultSize = lines * 17 * 10 * ImgUtil::NUM_HEIGHT * ImgUtil::NUM_WIDTH; + int inputSize = num_height * num_width * 10; + int resultSize = lines * num_count * 10 * num_height * num_width; //创建缓存对象 - cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, ImgUtil::numsOneLevel, &error); + cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, numsOneLevelData, &error); if (error < 0) { throw("Creat memObject1 failed!\n"); } @@ -313,11 +319,12 @@ } - int line_nums = 17; //设置内核参数 error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error |= clSetKernelArg(kernel, 1, sizeof(int), &line_nums); - error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 1, sizeof(int), &num_width); + error |= clSetKernelArg(kernel, 2, sizeof(int), &num_height); + error |= clSetKernelArg(kernel, 3, sizeof(int), &num_count); + error |= clSetKernelArg(kernel, 4, sizeof(cl_mem), &memObject2); if (error != CL_SUCCESS) { throw("Error setting kernel arguments!\n"); -- Gitblit v1.8.0