Я продвигался вперед с более сложными аспектами обработки изображений с использованием opencl. Теперь я попробовал сопоставление с шаблоном, и я получаю некоторые результаты, но не уверен, что это правильно. Я думаю, что шаблон все равно подобран.. вот скрипты и изображения, которые я использовал...
файл Python:
import pyopencl as cl
import numpy as np
from PIL import Image
from time import time
import cv2
def getAssets(platform,device):
plat = cl.get_platforms()[platform]
dev = plat.get_devices()[device]
ctx = cl.Context([dev])
q = cl.CommandQueue(ctx)
return ctx,q
def getKernel():
string = "F:\Image processing\Template\matchTemplate.c"
krnl = open(string).read()
return krnl
def execution(image,template):
cntx,queue = getAssets(0,0)
img = np.asarray(image).astype(np.int32)
temp = np.asarray(template).astype(np.int32)
mf = cl.mem_flags
inp = cl.Buffer(cntx,mf.READ_ONLY | mf.COPY_HOST_PTR,hostbuf=img)
tmp = cl.Buffer(cntx,mf.READ_ONLY | mf.COPY_HOST_PTR,hostbuf=temp)
out = cl.Buffer(cntx,mf.WRITE_ONLY,img.nbytes)
task = cl.Program(cntx,getKernel()%(x,y)).build()
val = task.matchTmp(queue,img.shape,None,inp,tmp,out)
output = np.empty_like(img)
cl.enqueue_copy(queue,output,out)
output = output.astype(np.uint8)
print(output,output.min(),output.max())
return np.array(output)
def showResult(image,template):
result = execution(image,template)
result = Image.fromarray(result)
result.show()
if __name__ == '__main__':
image = cv2.imread("F:\Image processing\Template\cam.jpg",0)
template = cv2.imread("F:\Image processing\Template\Template.jpg",0)
global x,y
x = image.shape[1]
y = image.shape[0]
# print(image.shape)
# cv2.imshow("image",template)
# cv2.waitKey(0)
showResult(image,template)
файл ядра:
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
__kernel void matchTmp(__global int *inp,__global int *tmp,__global int *out){
int j = get_global_id(1);
int i = get_global_id(0);
int x = get_global_id(3);
int y = get_global_id(2);
int Iwidth = %d;
int rown = %d;
int w = 48;
int r= 48;
int value = 0,value1,value2,value3;
value1 = value1 + half_powr((tmp[x*48 + y] - inp[(i+x)*Iwidth + (j+y)]),2);
value2 = value2 + half_powr(tmp[x*48 + y],2);
value3 = value3 + half_powr(inp[(i+x)*Iwidth + (j+y)],2);
value = (value1/half_sqrt(value2*value3))*50;
value = (value < 0 ? 0 : value);
value = (value > 255 ? 255 : value);
out[i*Iwidth + j] = value;
}
Изображение: используемое изображение
Шаблон: шаблон для сопоставления
Результат: это результат
Я использовал method=CV_TM_SQDIFF_NORMED
, как показано на этом сайте OpenCV документ. Я действительно получаю большое значение рядом с объектом, но почему все остальное черное? Фактический результат должен выглядеть примерно так, как показано здесь... Может ли кто-нибудь помочь мне с этим, пожалуйста!