admin
2022-06-27 eda1a611bc4afcf1c36a6c728f432aec1f688e1b
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");