From c108e5ba42168841311b74034d89c31556d628c4 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期二, 12 七月 2022 17:24:10 +0800 Subject: [PATCH] '完善' --- ConsoleApplication/OpenCLExcuter.cpp | 375 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 368 insertions(+), 7 deletions(-) diff --git a/ConsoleApplication/OpenCLExcuter.cpp b/ConsoleApplication/OpenCLExcuter.cpp index 45d27b2..7c7089f 100644 --- a/ConsoleApplication/OpenCLExcuter.cpp +++ b/ConsoleApplication/OpenCLExcuter.cpp @@ -62,7 +62,7 @@ } -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) { +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 / (num_width * num_height); @@ -210,12 +210,224 @@ return fresult; } +// -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) { +void OpenCLExcuter::splitPlateNum(cv::Mat img, IntDataInfo pos, UcharDataInfo result, UcharDataInfo types, unsigned char* zero, int num_width, int num_height,int ele_count_per_line,int length_per_num) { + + clock_t time_0 = clock(); - kernel = clCreateKernel(program, "split_num", &error); + kernel = clCreateKernel(program, "split_plate_num", &error); + if (kernel == NULL) { + throw("Couldn't create kernel!\n"); + } + + int inputSize = (img.cols * img.rows); + + int resultSize = pos.length * (length_per_num * 10 * num_width * num_height); + + + //创建缓存对象 + + cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(unsigned char) * inputSize, img.data, &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) * pos.length * 4, pos.data, &error); + if (error < 0) { + throw("Creat memObject2 failed!\n"); + } + + cl_mem memObject3 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, + sizeof(unsigned char) * num_width * num_height, zero, &error); + if (error < 0) { + throw("Creat memObject3 failed!\n"); + } + + cl_mem memObject4 = clCreateBuffer(context, CL_MEM_WRITE_ONLY, + sizeof(unsigned char) * resultSize, NULL, &error); + if (error < 0) { + throw("Creat memObject4 failed!\n"); + } + + + + cl_mem memObject5 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, + sizeof(unsigned char) * types.length, types.data, &error); + if (error < 0) { + throw("Creat memObject5 failed!\n"); + } + + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject3); + error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject5); + error |= clSetKernelArg(kernel, 4, sizeof(int), &img.cols); + error |= clSetKernelArg(kernel, 5, sizeof(int), &num_width); + error |= clSetKernelArg(kernel, 6, sizeof(int), &num_height); + error |= clSetKernelArg(kernel, 7, sizeof(int), &ele_count_per_line); + error |= clSetKernelArg(kernel, 8, sizeof(int), &length_per_num); + error |= clSetKernelArg(kernel, 9, sizeof(cl_mem), &memObject4); + if (error != CL_SUCCESS) { + throw("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { pos.length }; + 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, memObject4, CL_TRUE, 0, resultSize * sizeof(unsigned char), + result.data, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw("Error reading result buffer!\n"); + } + + + + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + clReleaseMemObject(memObject4); + clReleaseMemObject(memObject5); + std::cout << " 耗时:" << (clock() - time_0) << std::endl; +} + + + + + +void OpenCLExcuter::splitPlateNum(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_plate_num", &error); + if (kernel == NULL) { + throw("Couldn't create kernel!\n"); + } + + int inputSize = (img_width * img_height); + + int resultSize = (pos_count / 4) * (num_count * num_width * num_height * 10); + + int length_per_num = 6; + + + //创建缓存对象 + + cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(unsigned char) * inputSize, img, &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) * pos_count * 4, pos, &error); + if (error < 0) { + throw("Creat memObject2 failed!\n"); + } + + cl_mem memObject3 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, + sizeof(unsigned char) * num_width * num_height, zero, &error); + if (error < 0) { + throw("Creat memObject3 failed!\n"); + } + + cl_mem memObject4 = clCreateBuffer(context, CL_MEM_WRITE_ONLY, + sizeof(unsigned char) * resultSize, NULL, &error); + if (error < 0) { + throw("Creat memObject4 failed!\n"); + } + + + unsigned char types[4] = { + NUM_TYPE_CODE, + NUM_TYPE_TIME, + NUM_TYPE_PRICE, + NUM_TYPE_MONEY, + }; + + cl_mem memObject5 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, + sizeof(unsigned char) * 4, types, &error); + if (error < 0) { + throw("Creat memObject5 failed!\n"); + } + + int ele_count_line = 4; + + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject3); + error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject5); + error |= clSetKernelArg(kernel, 4, sizeof(int), &img_width); + error |= clSetKernelArg(kernel, 5, sizeof(int), &num_width); + error |= clSetKernelArg(kernel, 6, sizeof(int), &num_height); + error |= clSetKernelArg(kernel, 7, sizeof(int), &ele_count_line); + error |= clSetKernelArg(kernel, 8, sizeof(int), &length_per_num); + error |= clSetKernelArg(kernel, 9, sizeof(cl_mem), &memObject4); + if (error != CL_SUCCESS) { + throw("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { pos_count }; + 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, memObject4, CL_TRUE, 0, resultSize * sizeof(unsigned char), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw("Error reading result buffer!\n"); + } + + + + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + clReleaseMemObject(memObject4); + clReleaseMemObject(memObject5); + std::cout << " 耗时:" << (clock() - time_0) << std::endl; +} + + + +void OpenCLExcuter::splitTradeQueueNum(cv::Mat img, IntDataInfo pos, unsigned char* zero, int num_width, int num_height, unsigned char* result,int length_per_num) { + UcharDataInfo resultData = UcharDataInfo(); + resultData.data = result; + UcharDataInfo typesData = UcharDataInfo(); + unsigned char types[] = { NUM_TYPE_CODE }; + typesData.length = 1; + typesData.data = types; + splitPlateNum(img,pos, resultData, typesData,zero, num_width, num_height,1, length_per_num); +} + + + + +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_l2_num", &error); if (kernel == NULL) { throw("Couldn't create kernel!\n"); } @@ -293,7 +505,7 @@ -void OpenCLExcuter::createNumberTemplates(int lines,int num_width,int num_height,int num_count, uchar* numsOneLevelData, 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"); @@ -358,7 +570,7 @@ void OpenCLExcuter::splitL2RowData(unsigned char* imgs, int imgWidth, int imgHeight, int* rowIndexs, int lines, int* result) { - kernel = clCreateKernel(program, "splitRowData", &error); + kernel = clCreateKernel(program, "splitL2RowData", &error); if (kernel == NULL) { throw("Couldn't create kernel!\n"); } @@ -424,11 +636,87 @@ clReleaseMemObject(memObject3); } -void OpenCLExcuter::recognitionNotNum(unsigned char* imgs, int imgWidth, int imgHeight, int* rowIndexs,int colCount, int lines, + + +void OpenCLExcuter::splitLimitUpRowData(unsigned char* imgs, int imgWidth, int imgHeight, int* rowIndexs, int lines, int lineEleCount, + int* result) { + + kernel = clCreateKernel(program, "splitCommonRowData", &error); + if (kernel == NULL) { + throw("Couldn't create kernel!\n"); + } + + + int inputSize = imgWidth * imgHeight; + int resultSize = lines * lineEleCount * 4; + + int fromIndex = 1; + int toIndex = 4; + + + //创建缓存对象 + + 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, 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(int), &fromIndex); + error |= clSetKernelArg(kernel, 4, sizeof(int), &toIndex); + error |= clSetKernelArg(kernel, 5, sizeof(cl_mem), &memObject3); + + if (error != CL_SUCCESS) { + throw("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("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::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) { @@ -498,6 +786,79 @@ } + +void OpenCLExcuter::recognitionPlateMoneyUnit(unsigned char* imgs, int imgWidth, int imgHeight, int* rowIndexs, int colEleCount, int lines, + int* result) { + + clock_t time_1 = clock(); + + + kernel = clCreateKernel(program, "recognition_plate_money_unit", &error); + if (kernel == NULL) { + throw("Couldn't create kernel!\n"); + } + + + int inputSize = imgWidth * imgHeight; + int resultSize = lines * colEleCount; + + + //创建缓存对象 + + 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 * colEleCount, 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) { -- Gitblit v1.8.0