From a17738e1545ff7dbef6398b8ec1eab93ab59c9a1 Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期四, 30 六月 2022 19:14:47 +0800
Subject: [PATCH] '功能完善'

---
 ConsoleApplication/OpenCLExcuter.cpp |  138 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 136 insertions(+), 2 deletions(-)

diff --git a/ConsoleApplication/OpenCLExcuter.cpp b/ConsoleApplication/OpenCLExcuter.cpp
index 2df0471..5ca86a0 100644
--- a/ConsoleApplication/OpenCLExcuter.cpp
+++ b/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);

--
Gitblit v1.8.0