| | |
| | | } |
| | | |
| | | |
| | | 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"); |
| | | } |
| | |
| | | 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"); |
| | | } |
| | |
| | | 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"); |
| | | } |
| | |
| | | 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++) { |
| | |
| | | |
| | | |
| | | |
| | | 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); |
| | | |
| | | |
| | | //创建缓存对象 |
| | |
| | | } |
| | | |
| | | 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"); |
| | | } |
| | |
| | | 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"); |
| | | } |
| | |
| | | |
| | | |
| | | |
| | | 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"); |
| | | } |
| | |
| | | } |
| | | |
| | | |
| | | 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"); |