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