admin
2023-03-07 8b06b1cbf112d55307ea8a6efe711db4e7506d89
ConsoleApplication/OpenCLExcuter.cpp
@@ -1098,6 +1098,88 @@
}
void OpenCLExcuter::splitRowData(cv::Mat img, int* rowIndexs, int lines, int ele_count_per_line, int* result)
{
   kernel = clCreateKernel(program, "splitRowData", &error);
   if (kernel == NULL) {
      throw string("Couldn't create kernel!\n");
   }
   int inputSize = img.cols * img.rows;
   int resultSize = lines * ele_count_per_line * 4;
   //创建缓存对象
   cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, img.data, &error);
   if (error < 0) {
      throw string("Creat memObject1 failed!\n");
   }
   cl_mem memObject2 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int) * lines * 4, rowIndexs, &error);
   if (error < 0) {
      throw string("Creat memObject2 failed!\n");
   }
   cl_mem memObject3 = clCreateBuffer(context, CL_MEM_WRITE_ONLY,
      sizeof(int) * resultSize, NULL, &error);
   if (error < 0) {
      throw string("Creat memObject3 failed!\n");
   }
   try {
      //设置内核参数
      int min_empty_width = 5;
      int threshhold_color = _IMG_BINARY_THRESHOLD;
      error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1);
      error = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2);
      error |= clSetKernelArg(kernel, 2, sizeof(int), &img.cols);
      error |= clSetKernelArg(kernel, 3, sizeof(int), &ele_count_per_line);
      error |= clSetKernelArg(kernel, 4, sizeof(int), &min_empty_width);
      error |= clSetKernelArg(kernel, 5, sizeof(int), &threshhold_color);
      error |= clSetKernelArg(kernel, 6, sizeof(cl_mem), &memObject3);
      if (error != CL_SUCCESS) {
         throw string("Error setting kernel arguments!\n");
      }
      //执行内核
      size_t globalWorkSize[1] = { lines };
      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 string("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 string("Error reading result buffer!\n");
      }
      clReleaseKernel(kernel);
      clReleaseMemObject(memObject1);
      clReleaseMemObject(memObject2);
      clReleaseMemObject(memObject3);
   }
   catch (string st) {
      clReleaseKernel(kernel);
      clReleaseMemObject(memObject1);
      clReleaseMemObject(memObject2);
      clReleaseMemObject(memObject3);
      excuteError();
      throw st;
   }
}
void OpenCLExcuter::splitPlateContentRowData(unsigned char* imgs, int imgWidth, int imgHeight, int* rowIndexs, int lines, int lineEleCount, int fromIndex, int toIndex,