From 086ec74e94654e92b3a1c6f42612d12ef33ff4b2 Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期五, 28 十月 2022 14:41:08 +0800
Subject: [PATCH] '优化自启动机制'

---
 ConsoleApplication/OpenCLExcuter.cpp |  984 +++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 608 insertions(+), 376 deletions(-)

diff --git a/ConsoleApplication/OpenCLExcuter.cpp b/ConsoleApplication/OpenCLExcuter.cpp
index f792d65..9d6fdc9 100644
--- a/ConsoleApplication/OpenCLExcuter.cpp
+++ b/ConsoleApplication/OpenCLExcuter.cpp
@@ -146,7 +146,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 line_number_count) throw(std::string) {
 	//----------程序正文开始---------
 	auto startexectime = std::chrono::steady_clock::now();
 	const int resultSize = rows * cols / (num_width * num_height);
@@ -177,15 +177,20 @@
 	}
 
 	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(int), &num_width);
 	error |= clSetKernelArg(kernel, 4, sizeof(int), &num_height);
-	error |= clSetKernelArg(kernel, 5, sizeof(int), &num_count);
+	error |= clSetKernelArg(kernel, 5, sizeof(int), &line_number_count);
 	error |= clSetKernelArg(kernel, 6, sizeof(cl_mem), &memObject4);
 	if (error != CL_SUCCESS) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject4);
 		throw string("Error setting kernel arguments!\n");
 	}
 	//执行内核
@@ -197,6 +202,10 @@
 	error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize,
 		localWorkSize, 0, NULL, NULL);
 	if (error != CL_SUCCESS) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject4);
 		throw string("Error queuing kernel for execution!\n");
 	}
 
@@ -206,6 +215,10 @@
 		result, 0, NULL, NULL);
 	if (error != CL_SUCCESS) {
 		free(result);
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject4);
 		throw string("Error reading result buffer!\n");
 	}
 	/*
@@ -250,6 +263,12 @@
 		localWorkSize, 0, NULL, NULL);
 	if (error != CL_SUCCESS) {
 		free(result);
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject4);
+		clReleaseMemObject(memObject21);
+		clReleaseMemObject(memObject22);
 		throw string("Error queuing kernel for execution!\n");
 	}
 
@@ -260,6 +279,12 @@
 	if (error != CL_SUCCESS) {
 		free(result);
 		free(result2);
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject4);
+		clReleaseMemObject(memObject21);
+		clReleaseMemObject(memObject22);
 		throw string("Error reading result buffer!\n");
 	}
 
@@ -287,7 +312,7 @@
 	clReleaseMemObject(memObject22);
 
 	//复制最后的计算结果
-	int fcol = num_count;
+	int fcol = line_number_count;
 	int frow = rows / num_height;
 	unsigned char** fresult = (unsigned char**)malloc(sizeof(unsigned char*) * frow);
 
@@ -452,51 +477,164 @@
 		throw string("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 string("Error setting kernel arguments!\n");
+	try {
+
+		//设置内核参数
+		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 string("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 string("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 string("Error reading result buffer!\n");
+		}
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject3);
+		clReleaseMemObject(memObject4);
+		clReleaseMemObject(memObject5);
 	}
-	//执行内核
-	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 string("Error queuing kernel for execution!\n");
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject3);
+		clReleaseMemObject(memObject4);
+		clReleaseMemObject(memObject5);
+		throw st;
 	}
-
-	//读取执行结果
-	error = clEnqueueReadBuffer(queue, memObject4, CL_TRUE, 0, resultSize * sizeof(unsigned char),
-		result.data, 0, NULL, NULL);
-	if (error != CL_SUCCESS) {
-		throw string("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, 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_trade_queue_num", &error);
+	if (kernel == NULL) {
+		throw string("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 string("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 string("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 string("Creat memObject3 failed!\n");
+	}
+
+	cl_mem memObject4 = clCreateBuffer(context, CL_MEM_WRITE_ONLY,
+		sizeof(unsigned char) * resultSize, NULL, &error);
+	if (error < 0) {
+		throw string("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 string("Creat memObject5 failed!\n");
+	}
+
+	try {
+		//设置内核参数
+		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 string("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 string("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 string("Error reading result buffer!\n");
+		}
+
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject3);
+		clReleaseMemObject(memObject4);
+		clReleaseMemObject(memObject5);
+	}
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject3);
+		clReleaseMemObject(memObject4);
+		clReleaseMemObject(memObject5);
+		throw st;
+	}
+
+
+
+	
+	std::cout << " 耗时:" << (clock() - time_0) << std::endl;
+}
 
 
 
@@ -556,48 +694,59 @@
 	}
 
 	int ele_count_line = 4;
+	try {
+		//设置内核参数
+		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 string("Error setting kernel arguments!\n");
+		}
+		//执行内核
+		size_t globalWorkSize[1] = { pos_count };
+		size_t localWorkSize[1] = { 1 };
 
-	//设置内核参数
-	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 string("Error setting kernel arguments!\n");
+		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, memObject4, CL_TRUE, 0, resultSize * sizeof(unsigned char),
+			result, 0, NULL, NULL);
+		if (error != CL_SUCCESS) {
+			throw string("Error reading result buffer!\n");
+		}
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject3);
+		clReleaseMemObject(memObject4);
+		clReleaseMemObject(memObject5);
 	}
-	//执行内核
-	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 string("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 string("Error reading result buffer!\n");
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject3);
+		clReleaseMemObject(memObject4);
+		clReleaseMemObject(memObject5);
+		throw st;
 	}
 
 
 
-	clReleaseKernel(kernel);
-	clReleaseMemObject(memObject1);
-	clReleaseMemObject(memObject2);
-	clReleaseMemObject(memObject3);
-	clReleaseMemObject(memObject4);
-	clReleaseMemObject(memObject5);
+	
 	std::cout << " 耗时:" << (clock() - time_0) << std::endl;
 }
 
@@ -654,45 +803,52 @@
 		throw string("Creat memObject4 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(int), &img_width);
-	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 string("Error setting kernel arguments!\n");
+	try {
+		//设置内核参数
+		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(int), &img_width);
+		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 string("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 string("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 string("Error reading result buffer!\n");
+		}
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject3);
+		clReleaseMemObject(memObject4);
+		std::cout << " 耗时:" << (clock() - time_0) << std::endl;
 	}
-	//执行内核
-	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 string("Error queuing kernel for execution!\n");
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject3);
+		clReleaseMemObject(memObject4);
+		throw st;
 	}
-
-	//读取执行结果
-	error = clEnqueueReadBuffer(queue, memObject4, CL_TRUE, 0, resultSize * sizeof(unsigned char),
-		result, 0, NULL, NULL);
-	if (error != CL_SUCCESS) {
-		throw string("Error reading result buffer!\n");
-	}
-
-
-
-	clReleaseKernel(kernel);
-	clReleaseMemObject(memObject1);
-	clReleaseMemObject(memObject2);
-	clReleaseMemObject(memObject3);
-	clReleaseMemObject(memObject4);
-	std::cout << " 耗时:" << (clock() - time_0) << std::endl;
 }
 
 
@@ -722,44 +878,52 @@
 		throw string("Creat memObject2 failed!\n");
 	}
 
+	try {
+		//设置内核参数
+		error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1);
+		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);
 
-	//设置内核参数
-	error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1);
-	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 string("Error setting kernel arguments!\n");
+		}
+		//执行内核
+		size_t globalWorkSize[1] = { lines };
+		size_t localWorkSize[1] = { 1 };
 
-	if (error != CL_SUCCESS) {
-		throw string("Error setting kernel arguments!\n");
+		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, memObject2, CL_TRUE, 0, resultSize * sizeof(unsigned char),
+			result, 0, NULL, NULL);
+		if (error != CL_SUCCESS) {
+			throw string("Error reading result buffer!\n");
+		}
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+
 	}
-	//执行内核
-	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");
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		throw st;
 	}
 
-	//读取执行结果
-	error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(unsigned char),
-		result, 0, NULL, NULL);
-	if (error != CL_SUCCESS) {
-		throw string("Error reading result buffer!\n");
-	}
-
-	clReleaseKernel(kernel);
-	clReleaseMemObject(memObject1);
-	clReleaseMemObject(memObject2);
 }
 
 
 
-void OpenCLExcuter::splitL2RowData(unsigned char* imgs, int imgWidth, int imgHeight, int* rowIndexs, int lines,
+void OpenCLExcuter::splitL2RowData(cv::Mat img, int* rowIndexs, int lines,
 	int* result) {
 
 	kernel = clCreateKernel(program, "splitL2RowData", &error);
@@ -768,13 +932,13 @@
 	}
 
 
-	int inputSize = imgWidth * imgHeight;
+	int inputSize = img.cols * img.rows;
 	int resultSize = lines * 7 * 4;
 
 
 	//创建缓存对象
 
-	cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, imgs, &error);
+	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");
 	}
@@ -791,41 +955,50 @@
 		throw string("Creat memObject3 failed!\n");
 	}
 
+	try {
+		//设置内核参数
+		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(cl_mem), &memObject3);
 
-	//设置内核参数
-	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 string("Error setting kernel arguments!\n");
+		}
+		//执行内核
+		size_t globalWorkSize[1] = { lines };
+		size_t localWorkSize[1] = { 1 };
 
-	if (error != CL_SUCCESS) {
-		throw string("Error setting kernel arguments!\n");
+		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);
 	}
-	//执行内核
-	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");
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject3);
+		throw st;
 	}
 
 	//printf("%d %d %d %d \n", result[0], result[1], result[2], result[3]);
 
-	clReleaseKernel(kernel);
-	clReleaseMemObject(memObject1);
-	clReleaseMemObject(memObject2);
-	clReleaseMemObject(memObject3);
+
 }
 
 
@@ -862,43 +1035,52 @@
 		throw string("Creat memObject3 failed!\n");
 	}
 
+	try {
+		//设置内核参数
+		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);
 
-	//设置内核参数
-	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 string("Error setting kernel arguments!\n");
+		}
+		//执行内核
+		size_t globalWorkSize[1] = { lines };
+		size_t localWorkSize[1] = { 1 };
 
-	if (error != CL_SUCCESS) {
-		throw string("Error setting kernel arguments!\n");
+		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);
 	}
-	//执行内核
-	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");
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject3);
+		throw st;
 	}
 
 	//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,
@@ -936,41 +1118,50 @@
 		throw string("Creat memObject3 failed!\n");
 	}
 
+	try {
+		//设置内核参数
+		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);
 
-	//设置内核参数
-	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 string("Error setting kernel arguments!\n");
+		}
+		//执行内核
+		size_t globalWorkSize[1] = { resultSize };
+		size_t localWorkSize[1] = { 1 };
 
-	if (error != CL_SUCCESS) {
-		throw string("Error setting kernel arguments!\n");
+		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);
 	}
-	//执行内核
-	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 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");
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject3);
+		throw st;
 	}
 
 	//printf("%d %d %d %d \n", result[0], result[1], result[2], result[3]);
 
-	clReleaseKernel(kernel);
-	clReleaseMemObject(memObject1);
-	clReleaseMemObject(memObject2);
-	clReleaseMemObject(memObject3);
+	
 
 }
 
@@ -1011,44 +1202,53 @@
 		throw string("Creat memObject3 failed!\n");
 	}
 
+	try {
+		//设置内核参数
+		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);
 
-	//设置内核参数
-	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 string("Error setting kernel arguments!\n");
+		}
+		//执行内核
+		size_t globalWorkSize[1] = { resultSize };
+		size_t localWorkSize[1] = { 1 };
 
-	if (error != CL_SUCCESS) {
-		throw string("Error setting kernel arguments!\n");
+		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);
 	}
-	//执行内核
-	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 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");
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		clReleaseMemObject(memObject3);
+		throw st;
 	}
 
 	//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,
+void OpenCLExcuter::rgb2Gray(cv::Mat img,
 	unsigned char* result) {
 
 	kernel = clCreateKernel(program, "rgb2GrayImg", &error);
@@ -1057,13 +1257,13 @@
 	}
 
 
-	int inputSize = imgWidth * imgHeight * 3;
-	int resultSize = imgWidth * imgHeight;
+	int inputSize = img.cols * img.rows * 3;
+	int resultSize = img.cols * img.rows;
 
 
 	//创建缓存对象
 
-	cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, imgs, &error);
+	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");
 	}
@@ -1075,41 +1275,49 @@
 	}
 
 
-	//设置内核参数
-	error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1);
-	error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth);
-	error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2);
+	try {
 
-	if (error != CL_SUCCESS) {
-		throw string("Error setting kernel arguments!\n");
+		//设置内核参数
+		error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1);
+		error |= clSetKernelArg(kernel, 1, sizeof(int), &img.cols);
+		error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2);
+
+		if (error != CL_SUCCESS) {
+			throw string("Error setting kernel arguments!\n");
+		}
+		//执行内核
+		size_t globalWorkSize[1] = { img.rows };
+		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, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar),
+			result, 0, NULL, NULL);
+		if (error != CL_SUCCESS) {
+			throw string("Error reading result buffer!\n");
+		}
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
 	}
-	//执行内核
-	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 string("Error queuing kernel for execution!\n");
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		throw st;
 	}
-
-	//读取执行结果
-	error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar),
-		result, 0, NULL, NULL);
-	if (error != CL_SUCCESS) {
-		throw string("Error reading result buffer!\n");
-	}
-
-	clReleaseKernel(kernel);
-	clReleaseMemObject(memObject1);
-	clReleaseMemObject(memObject2);
 
 }
 
 
-void OpenCLExcuter::rgba2Gray(unsigned char* imgs, int imgWidth, int imgHeight,
+void OpenCLExcuter::rgba2Gray(cv::Mat img,
 	unsigned char* result) {
 
 	kernel = clCreateKernel(program, "rgba2GrayImg", &error);
@@ -1118,13 +1326,13 @@
 	}
 
 
-	int inputSize = imgWidth * imgHeight * 4;
-	int resultSize = imgWidth * imgHeight;
+	int inputSize = img.cols * img.rows * 4;
+	int resultSize = img.cols * img.rows;
 
 
 	//创建缓存对象
 
-	cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, imgs, &error);
+	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");
 	}
@@ -1135,37 +1343,47 @@
 		throw string("Creat memObject2 failed!\n");
 	}
 
+	try {
 
-	//设置内核参数
-	error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1);
-	error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth);
-	error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2);
+		//设置内核参数
+		error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1);
+		error |= clSetKernelArg(kernel, 1, sizeof(int), &img.cols);
+		error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2);
 
-	if (error != CL_SUCCESS) {
-		throw string("Error setting kernel arguments!\n");
+		if (error != CL_SUCCESS) {
+			throw string("Error setting kernel arguments!\n");
+		}
+		//执行内核
+		size_t globalWorkSize[1] = { img.rows };
+		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, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar),
+			result, 0, NULL, NULL);
+		if (error != CL_SUCCESS) {
+			throw string("Error reading result buffer!\n");
+		}
+
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
 	}
-	//执行内核
-	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 string("Error queuing kernel for execution!\n");
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		throw st;
 	}
 
-	//读取执行结果
-	error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar),
-		result, 0, NULL, NULL);
-	if (error != CL_SUCCESS) {
-		throw string("Error reading result buffer!\n");
-	}
-
-	clReleaseKernel(kernel);
-	clReleaseMemObject(memObject1);
-	clReleaseMemObject(memObject2);
+	
 
 }
 
@@ -1199,38 +1417,45 @@
 	}
 
 
+	try {
+		//设置内核参数
+		error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1);
+		error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth);
+		error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2);
+		error |= clSetKernelArg(kernel, 3, sizeof(int), &threadhold);
 
-	//设置内核参数
-	error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1);
-	error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth);
-	error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2);
-	error |= clSetKernelArg(kernel, 3, sizeof(int), &threadhold);
+		if (error != CL_SUCCESS) {
+			throw string("Error setting kernel arguments!\n");
+		}
+		//执行内核
+		size_t globalWorkSize[1] = { imgHeight };
+		size_t localWorkSize[1] = { 1 };
 
-	if (error != CL_SUCCESS) {
-		throw string("Error setting kernel arguments!\n");
+		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, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar),
+			result, 0, NULL, NULL);
+		if (error != CL_SUCCESS) {
+			throw string("Error reading result buffer!\n");
+		}
+
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
 	}
-	//执行内核
-	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 string("Error queuing kernel for execution!\n");
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		throw st;
 	}
-
-	//读取执行结果
-	error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar),
-		result, 0, NULL, NULL);
-	if (error != CL_SUCCESS) {
-		throw string("Error reading result buffer!\n");
-	}
-
-	clReleaseKernel(kernel);
-	clReleaseMemObject(memObject1);
-	clReleaseMemObject(memObject2);
 
 }
 
@@ -1261,38 +1486,45 @@
 		throw string("Creat memObject2 failed!\n");
 	}
 
+	try {
+		//设置内核参数
+		error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1);
+		error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth);
+		error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2);
+		error |= clSetKernelArg(kernel, 3, sizeof(int), &threadhold);
 
-	//设置内核参数
-	error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1);
-	error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth);
-	error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2);
-	error |= clSetKernelArg(kernel, 3, sizeof(int), &threadhold);
+		if (error != CL_SUCCESS) {
+			throw string("Error setting kernel arguments!\n");
+		}
+		//执行内核
+		size_t globalWorkSize[1] = { imgHeight };
+		size_t localWorkSize[1] = { 1 };
 
-	if (error != CL_SUCCESS) {
-		throw string("Error setting kernel arguments!\n");
+		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, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar),
+			result, 0, NULL, NULL);
+		if (error != CL_SUCCESS) {
+			throw string("Error reading result buffer!\n");
+		}
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
 	}
-	//执行内核
-	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 string("Error queuing kernel for execution!\n");
+	catch (string st) {
+		clReleaseKernel(kernel);
+		clReleaseMemObject(memObject1);
+		clReleaseMemObject(memObject2);
+		throw st;
 	}
 
-	//读取执行结果
-	error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar),
-		result, 0, NULL, NULL);
-	if (error != CL_SUCCESS) {
-		throw string("Error reading result buffer!\n");
-	}
-
-	clReleaseKernel(kernel);
-	clReleaseMemObject(memObject1);
-	clReleaseMemObject(memObject2);
 
 }
 

--
Gitblit v1.8.0