From eda1a611bc4afcf1c36a6c728f432aec1f688e1b Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期一, 27 六月 2022 19:13:36 +0800
Subject: [PATCH] 'GP代码识别'

---
 ConsoleApplication/OpenCLExcuter.cpp |   47 +++++++++++++++++++++++++++--------------------
 1 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/ConsoleApplication/OpenCLExcuter.cpp b/ConsoleApplication/OpenCLExcuter.cpp
index d94176c..2df0471 100644
--- a/ConsoleApplication/OpenCLExcuter.cpp
+++ b/ConsoleApplication/OpenCLExcuter.cpp
@@ -62,13 +62,13 @@
 }
 
 
-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");
 	}
@@ -92,12 +92,15 @@
 		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");
 	}
@@ -134,7 +137,7 @@
 	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");
 	}
@@ -191,8 +194,8 @@
 	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++) {
@@ -209,17 +212,17 @@
 
 
 
-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);
 
 
 	//创建缓存对象
@@ -236,7 +239,7 @@
 	}
 
 	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");
 	}
@@ -252,7 +255,10 @@
 	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");
 	}
@@ -287,20 +293,20 @@
 
 
 
-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");
 	}
@@ -313,11 +319,12 @@
 	}
 
 
-	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");

--
Gitblit v1.8.0