admin
2022-06-30 a17738e1545ff7dbef6398b8ec1eab93ab59c9a1
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);