亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? programcu.cu

?? SiftGPU is an implementation of SIFT [1] for GPU. SiftGPU processes pixels parallely to build Gaussi
?? CU
?? 第 1 頁(yè) / 共 4 頁(yè)
字號(hào):
		float off =  0.5f * FDIV(next - pre, weight + weight - next - pre);
		key.w = radius_per_ten_degrees * (index_max + 0.5f + off);
		d_list[idx] = key;
	
	}else
	{
		float max_vote = vote[0];
#pragma unroll
		for(int i = 1; i < 36; ++i)		max_vote = max(max_vote, vote[i]);

		float vote_threshold = max_vote * 0.8f;
		float pre = vote[35];
		float max_rot[2], max_vot[2] = {0, 0};
		int  ocount = 0;
#pragma unroll
		for(int i =0; i < 36; ++i)
		{
			float next = vote[i + 1];
			if(vote[i] > vote_threshold && vote[i] > pre && vote[i] > next)
			{
				float di = 0.5f * FDIV(next - pre, vote[i] + vote[i] - next - pre);
				float rot = i + di + 0.5f;
				float weight = vote[i];
				///
				if(weight > max_vot[1])
				{
					if(weight > max_vot[0])
					{
						max_vot[1] = max_vot[0];
						max_rot[1] = max_rot[0];
						max_vot[0] = weight;
						max_rot[0] = rot;
					}
					else
					{
						max_vot[1] = weight;
						max_rot[1] = rot;
					}
					ocount ++;
				}
			}
			pre = vote[i];
		}
		float fr1 = max_rot[0] / 36.0f; 
		if(fr1 < 0) fr1 += 1.0f; 
		unsigned short us1 = ocount == 0? 65535 : ((unsigned short )floor(fr1 * 65535.0f));
		unsigned short us2 = 65535;
		if(ocount > 1)
		{
			float fr2 = max_rot[1] / 36.0f; 
			if(fr2 < 0) fr2 += 1.0f;
			us2 = (unsigned short ) floor(fr2 * 65535.0f);
		}
		unsigned int uspack = (us2 << 16) | us1;
		key.w = __int_as_float(uspack);
		d_list[idx] = key;
	}

}

void ProgramCU::ComputeOrientation(CuTexImage* list, CuTexImage* got, CuTexImage*key, 
								   float sigma, float sigma_step, int existing_keypoint)
{
	int len = list->GetImgWidth();
	if(len <= 0) return;
	int width = got->GetImgWidth(), height = got->GetImgHeight();
	if(existing_keypoint)
	{
		list->BindTexture(texDataF4);
	}else
	{
		list->BindTexture(texDataList);
		if(GlobalUtil::_SubpixelLocalization) key->BindTexture(texDataF4);
	}
	got->BindTexture2D(texDataF2);

	const int block_width = 64;
	dim3 grid((len + block_width -1) / block_width);
	dim3 block(block_width);

	ComputeOrientation_Kernel<<<grid, block>>>((float4*) list->_cuData, 
		len, width, height, sigma, sigma_step, 
		GlobalUtil::_OrientationGaussianFactor, 
		GlobalUtil::_OrientationGaussianFactor * GlobalUtil::_OrientationWindowFactor,
		GlobalUtil::_FixedOrientation? 0 : GlobalUtil::_MaxOrientation, 
		existing_keypoint, GlobalUtil::_SubpixelLocalization, GlobalUtil::_KeepExtremumSign);

	ProgramCU::CheckErrorCUDA("ComputeOrientation");
}

template <bool DYNAMIC_INDEXING> void __global__ ComputeDescriptor_Kernel(float4* d_des, int num, 
											 int width, int height, float window_factor)
{
	const float rpi = 4.0/ 3.14159265358979323846;
	int idx = IMUL(blockIdx.x, blockDim.x) + threadIdx.x;
	int fidx = idx >> 4;
	if(fidx >= num) return;
	float4 key = tex1Dfetch(texDataF4, fidx);
	int bidx = idx& 0xf, ix = bidx & 0x3, iy = bidx >> 2;
	float spt = fabs(key.z * window_factor);
	float s, c; __sincosf(key.w, &s, &c);
	float anglef = key.w > 3.14159265358979323846? key.w - (2.0 * 3.14159265358979323846) : key.w ; 
	float cspt = c * spt, sspt = s * spt;
	float crspt = c / spt, srspt = s / spt;
	float2 offsetpt, pt;
	float xmin, ymin, xmax, ymax, bsz;
	offsetpt.x = ix - 1.5f;
	offsetpt.y = iy - 1.5f;
	pt.x = cspt * offsetpt.x - sspt * offsetpt.y + key.x;
	pt.y = cspt * offsetpt.y + sspt * offsetpt.x + key.y;
	bsz =  fabs(cspt) + fabs(sspt);
	xmin = max(1.5f, floor(pt.x - bsz) + 0.5f);
	ymin = max(1.5f, floor(pt.y - bsz) + 0.5f);
	xmax = min(width - 1.5f, floor(pt.x + bsz) + 0.5f);
	ymax = min(height - 1.5f, floor(pt.y + bsz) + 0.5f);
	float des[9];
#pragma unroll
	for(int i =0; i < 9; ++i) des[i] = 0.0f;
	for(float y = ymin; y <= ymax; y += 1.0f)
	{
		for(float x = xmin; x <= xmax; x += 1.0f)
		{
			float dx = x - pt.x;
			float dy = y - pt.y;
			float nx = crspt * dx + srspt * dy;
			float ny = crspt * dy - srspt * dx;
			float nxn = fabs(nx);
			float nyn = fabs(ny);
			if(nxn < 1.0f && nyn < 1.0f)
			{
				float2 cc = tex2D(texDataF2, x, y);
				float dnx = nx + offsetpt.x;
				float dny = ny + offsetpt.y;
				float ww = exp(-0.125f * (dnx * dnx + dny * dny));
				float wx = 1.0 - nxn;
				float wy = 1.0 - nyn;
				float weight = ww * wx * wy * cc.x;
				float theta = (anglef - cc.y) * rpi;
				if(theta < 0) theta += 8.0f;
				float fo = floor(theta);
				int fidx = fo;
				float weight1 = fo + 1.0f  - theta;
				float weight2 = theta - fo;
				if(DYNAMIC_INDEXING)
				{
					des[fidx] += (weight1 * weight);
					des[fidx + 1] += (weight2 * weight);
					//this dynamic indexing part might be slow
				}else
				{
					#pragma unroll
					for(int k = 0; k < 8; ++k)
					{
						if(k == fidx) 
						{
							des[k] += (weight1 * weight);
							des[k+1] += (weight2 * weight);
						}
					}
				}
			}
		}
	}
	des[0] += des[8];

	int didx = idx << 1;
	d_des[didx] = make_float4(des[0], des[1], des[2], des[3]);
	d_des[didx+1] = make_float4(des[4], des[5], des[6], des[7]);
}


void __global__ NormalizeDescriptor_Kernel(float4* d_des, int num)
{
	float4 temp[32];
	int idx = IMUL(blockIdx.x, blockDim.x) + threadIdx.x;
	if(idx >= num) return;
	int sidx = idx << 5;
	float norm1 = 0, norm2 = 0;
#pragma unroll
	for(int i = 0; i < 32; ++i)
	{
		temp[i] = tex1Dfetch(texDataF4, sidx +i);
		norm1 += (temp[i].x * temp[i].x + temp[i].y * temp[i].y +
				 temp[i].z * temp[i].z + temp[i].w * temp[i].w);
	}
	norm1 = rsqrt(norm1);

#pragma unroll
	for(int i = 0; i < 32; ++i)
	{
		temp[i].x = min(0.2f, temp[i].x * norm1);
		temp[i].y = min(0.2f, temp[i].y * norm1);
		temp[i].z = min(0.2f, temp[i].z * norm1);
		temp[i].w = min(0.2f, temp[i].w * norm1);
		norm2 += (temp[i].x * temp[i].x + temp[i].y * temp[i].y +
				 temp[i].z * temp[i].z + temp[i].w * temp[i].w);
	}

	norm2 = rsqrt(norm2);
#pragma unroll
	for(int i = 0; i < 32; ++i)
	{
		temp[i].x *= norm2;		temp[i].y *= norm2;
		temp[i].z *= norm2;		temp[i].w *= norm2;
		d_des[sidx + i] = temp[i];
	}

}
void ProgramCU::ComputeDescriptor(CuTexImage*list, CuTexImage* got, CuTexImage* dtex)
{
	int num = list->GetImgWidth();
	int width = got->GetImgWidth();
	int height = got->GetImgHeight();

	dtex->InitTexture(num*128, 1, 1);
	got->BindTexture2D(texDataF2);
	list->BindTexture(texDataF4);


	int block_width = 64;
	dim3 grid((num * 16 + block_width -1) / block_width);
	dim3 block(block_width);

	if(GlobalUtil::_UseDynamicIndexing)
		ComputeDescriptor_Kernel<true><<<grid, block>>>((float4*) dtex->_cuData, num, width, height, GlobalUtil::_DescriptorWindowFactor);
	else
		ComputeDescriptor_Kernel<false><<<grid, block>>>((float4*) dtex->_cuData, num, width, height, GlobalUtil::_DescriptorWindowFactor);


	if(GlobalUtil::_NormalizedSIFT)
	{
		dtex->BindTexture(texDataF4);
		const int block_width = 32;
		dim3 grid((num + block_width -1) / block_width);
		dim3 block(block_width);
		NormalizeDescriptor_Kernel<<<grid, block>>>((float4*) dtex->_cuData, num);
	}

	CheckErrorCUDA("ComputeDescriptor");
}

//////////////////////////////////////////////////////
void ProgramCU::FinishCUDA()
{
	cudaThreadSynchronize();
}

void ProgramCU::CheckErrorCUDA(const char* location)
{
	cudaError_t e = cudaGetLastError();
	if(e)
	{
		if(location) std::cerr << location << ":\t";
		std::cerr << cudaGetErrorString(e) << endl;
	}
}

void __global__ ConvertDOG_Kernel(float* d_result, int width, int height)
{
	int row = (blockIdx.y << BLOCK_LOG_DIM) + threadIdx.y;
	int col = (blockIdx.x << BLOCK_LOG_DIM) + threadIdx.x;
	if(col < width && row < height)
	{
		int index = row * width  + col;
		float v = tex1Dfetch(texData, index);
		d_result[index] = (col == 0 || row == 0 || col == width -1 || row == height -1)?
			0.5 : saturate(0.5+20.0*v);
	}
}
///
void ProgramCU::DisplayConvertDOG(CuTexImage* dog, CuTexImage* out)
{
	if(out->_cuData == NULL) return;
	int width = dog->GetImgWidth(), height = dog ->GetImgHeight();
	dog->BindTexture(texData);
	dim3 grid((width + BLOCK_DIM - 1)/ BLOCK_DIM,  (height + BLOCK_DIM - 1)/BLOCK_DIM);
	dim3 block(BLOCK_DIM, BLOCK_DIM);
	ConvertDOG_Kernel<<<grid, block>>>((float*) out->_cuData, width, height);
	ProgramCU::CheckErrorCUDA("DisplayConvertDOG");
}

void __global__ ConvertGRD_Kernel(float* d_result, int width, int height)
{
	int row = (blockIdx.y << BLOCK_LOG_DIM) + threadIdx.y;
	int col = (blockIdx.x << BLOCK_LOG_DIM) + threadIdx.x;
	if(col < width && row < height)
	{
		int index = row * width  + col;
		float v = tex1Dfetch(texData, index << 1);
		d_result[index] = (col == 0 || row == 0 || col == width -1 || row == height -1)?
				0 : saturate(5 * v);

	}
}


void ProgramCU::DisplayConvertGRD(CuTexImage* got, CuTexImage* out)
{
	if(out->_cuData == NULL) return;
	int width = got->GetImgWidth(), height = got ->GetImgHeight();
	got->BindTexture(texData);
	dim3 grid((width + BLOCK_DIM - 1)/ BLOCK_DIM,  (height + BLOCK_DIM - 1)/BLOCK_DIM);
	dim3 block(BLOCK_DIM, BLOCK_DIM);
	ConvertGRD_Kernel<<<grid, block>>>((float*) out->_cuData, width, height);
	ProgramCU::CheckErrorCUDA("DisplayConvertGRD");
}

void __global__ ConvertKEY_Kernel(float4* d_result, int width, int height)
{

	int row = (blockIdx.y << BLOCK_LOG_DIM) + threadIdx.y;
	int col = (blockIdx.x << BLOCK_LOG_DIM) + threadIdx.x;
	if(col < width && row < height)
	{
		int index = row * width + col;
		float4 keyv = tex1Dfetch(texDataF4, index);
		int is_key = (keyv.x == 1.0f || keyv.x == -1.0f); 
		int inside = col > 0 && row > 0 && row < height -1 && col < width - 1;
		float v = inside? saturate(0.5 + 20 * tex1Dfetch(texData, index)) : 0.5;
		d_result[index] = is_key && inside ? 
			(keyv.x > 0? make_float4(1.0f, 0, 0, 1.0f) : make_float4(0.0f, 1.0f, 0.0f, 1.0f)): 
			make_float4(v, v, v, 1.0f) ;
	}
}
void ProgramCU::DisplayConvertKEY(CuTexImage* key, CuTexImage* dog, CuTexImage* out)
{
	if(out->_cuData == NULL) return;
	int width = key->GetImgWidth(), height = key ->GetImgHeight();
	dog->BindTexture(texData);
	key->BindTexture(texDataF4);
	dim3 grid((width + BLOCK_DIM - 1)/ BLOCK_DIM,  (height + BLOCK_DIM - 1)/BLOCK_DIM);
	dim3 block(BLOCK_DIM, BLOCK_DIM);
	ConvertKEY_Kernel<<<grid, block>>>((float4*) out->_cuData, width, height);
}


void __global__ DisplayKeyPoint_Kernel(float4 * d_result, int num)
{
	int idx = IMUL(blockIdx.x, blockDim.x) + threadIdx.x;
	if(idx >= num) return;
	float4 v = tex1Dfetch(texDataF4, idx);
	d_result[idx] = make_float4(v.x, v.y, 0, 1.0f);
}

void ProgramCU::DisplayKeyPoint(CuTexImage* ftex, CuTexImage* out)
{
	int num = ftex->GetImgWidth();
	int block_width = 64;
	dim3 grid((num + block_width -1) /block_width);
	dim3 block(block_width);
	ftex->BindTexture(texDataF4);
	DisplayKeyPoint_Kernel<<<grid, block>>>((float4*) out->_cuData, num);
	ProgramCU::CheckErrorCUDA("DisplayKeyPoint");
}

void __global__ DisplayKeyBox_Kernel(float4* d_result, int num)
{
	int idx = IMUL(blockIdx.x, blockDim.x) + threadIdx.x;
	if(idx >= num) return;
	int  kidx = idx / 10, vidx = idx - IMUL(kidx , 10);
	float4 v = tex1Dfetch(texDataF4, kidx);
	float sz = fabs(v.z * 3.0f);
	///////////////////////
	float s, c;	__sincosf(v.w, &s, &c);
	///////////////////////
	float dx = vidx == 0? 0 : ((vidx <= 4 || vidx >= 9)? sz : -sz);
	float dy = vidx <= 1? 0 : ((vidx <= 2 || vidx >= 7)? -sz : sz);
	float4 pos;
	pos.x = v.x + c * dx - s * dy;
	pos.y = v.y + c * dy + s * dx;
	pos.z = 0;	pos.w = 1.0f;
	d_result[idx]  = pos;
}

void ProgramCU::DisplayKeyBox(CuTexImage* ftex, CuTexImage* out)
{
	int len = ftex->GetImgWidth();
	int block_width = 32;
	dim3 grid((len * 10 + block_width -1) / block_width);
	dim3 block(block_width);
	ftex->BindTexture(texDataF4);
	DisplayKeyBox_Kernel<<<grid, block>>>((float4*) out->_cuData, len * 10);
}
///////////////////////////////////////////////////////////////////
inline void CuTexImage:: BindTexture(textureReference& texRef)
{
	 cudaBindTexture(NULL, &texRef, _cuData, &texRef.channelDesc, _numBytes);
}

inline void CuTexImage::BindTexture2D(textureReference& texRef)
{
	cudaChannelFormatDesc desc;
	cudaGetChannelDesc(&desc, _cuData2D);
	cudaBindTextureToArray(&texRef, _cuData2D, &desc);
}

int ProgramCU::IsCudaSupported()
{
	int deviceCount;
	cudaGetDeviceCount(&deviceCount);
	return deviceCount;
}

////////////////////////////////////////////////////////////////////////////////////////
// siftmatch funtions

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区av电影| 欧美一区二区三区的| 日韩午夜小视频| 777久久久精品| 精品国产一二三区| 国产亚洲欧美在线| 一色屋精品亚洲香蕉网站| 亚洲九九爱视频| 精品一区二区免费视频| 国产ts人妖一区二区| 不卡av免费在线观看| 欧美久久久一区| 国产午夜三级一区二区三| 一区二区理论电影在线观看| 婷婷久久综合九色国产成人| 国产一区二区三区不卡在线观看| 99re8在线精品视频免费播放| 欧美日韩精品欧美日韩精品一| 欧美成人官网二区| 一级特黄大欧美久久久| 国产精品白丝jk白祙喷水网站 | 高潮精品一区videoshd| 日本乱人伦一区| 久久综合色之久久综合| 亚洲私人影院在线观看| 韩国成人福利片在线播放| 91丨porny丨蝌蚪视频| 久久影院视频免费| 亚洲成av人片一区二区三区| 波多野结衣欧美| 国产欧美精品国产国产专区| 蜜乳av一区二区| 一本大道av伊人久久综合| 欧美激情中文字幕一区二区| 日韩国产欧美在线播放| 一本色道亚洲精品aⅴ| 亚洲视频资源在线| caoporm超碰国产精品| 久久天天做天天爱综合色| 丝袜亚洲另类丝袜在线| 欧美日韩国产小视频在线观看| 国产精品少妇自拍| 成人av电影在线播放| 久久精品视频一区二区| 懂色av一区二区在线播放| 日韩欧美成人一区| 理论片日本一区| 欧美不卡一区二区三区| 国产综合色在线视频区| 欧美大肚乱孕交hd孕妇| 国产一区二区影院| 国产欧美精品一区二区三区四区| 国产精品影视在线观看| 国产欧美日韩麻豆91| 成人久久视频在线观看| 亚洲美女一区二区三区| 欧美亚洲一区三区| 男男gaygay亚洲| 国产日韩影视精品| 色哟哟一区二区在线观看| 午夜亚洲国产au精品一区二区| 91麻豆精品国产91久久久久久久久| 日本不卡在线视频| 国产欧美日韩视频在线观看| 一区二区三区小说| 国产成人免费视频精品含羞草妖精 | 91视视频在线观看入口直接观看www| 久久亚洲影视婷婷| 成av人片一区二区| 日本欧美肥老太交大片| 久久久99久久精品欧美| 欧美影院精品一区| 久久99精品久久久久久国产越南 | k8久久久一区二区三区| 日韩国产欧美在线观看| 国产精品嫩草99a| 欧美一区二区三区白人| 成人在线综合网| 免费不卡在线观看| 亚洲与欧洲av电影| 中文字幕欧美一区| 久久久久国产精品麻豆ai换脸 | 欧美国产日韩亚洲一区| 日韩欧美一卡二卡| 制服丝袜日韩国产| 欧美日韩免费视频| 91天堂素人约啪| 99久久精品国产毛片| 国产精品77777竹菊影视小说| 午夜伦理一区二区| 亚洲视频狠狠干| 国产精品久久免费看| 久久久久久久性| 久久嫩草精品久久久精品| 日韩欧美综合一区| 日韩亚洲电影在线| 精品sm捆绑视频| 精品国产一区二区在线观看| 欧美一区二区视频网站| 91精品国产综合久久香蕉的特点| 91国模大尺度私拍在线视频| 99re成人在线| 欧美巨大另类极品videosbest | 免费成人在线观看| 精品一区二区三区在线播放 | 久久久噜噜噜久噜久久综合| 久久久久国产精品人| 欧美国产禁国产网站cc| 国产精品伦一区二区三级视频| 国产精品久久久久影视| 亚洲蜜臀av乱码久久精品蜜桃| 一区二区三区四区高清精品免费观看 | 久久不见久久见中文字幕免费| 国模无码大尺度一区二区三区| 国产一区二区三区四区五区美女| 国产一区视频网站| 色综合中文字幕国产| 色吊一区二区三区| 精品久久国产字幕高潮| 久久久久久久av麻豆果冻| 一区二区三区四区在线免费观看| 天堂成人免费av电影一区| 理论片日本一区| 在线亚洲一区二区| 精品乱人伦一区二区三区| 国产精品国产三级国产普通话99| 亚洲啪啪综合av一区二区三区| 午夜久久久久久久久久一区二区| 国产乱码精品一区二区三区av | 日韩写真欧美这视频| 欧美国产国产综合| 麻豆久久久久久久| 91国内精品野花午夜精品| 久久亚洲免费视频| 日本色综合中文字幕| 成人午夜免费电影| 日韩欧美卡一卡二| 秋霞成人午夜伦在线观看| 99久久精品国产麻豆演员表| 26uuu国产电影一区二区| 偷拍一区二区三区四区| 91在线视频播放地址| 欧美精品一区二区三区在线播放| 偷拍亚洲欧洲综合| 欧美中文字幕一区二区三区亚洲| 中文字幕欧美激情| 国产成人一级电影| 精品国产乱码久久久久久1区2区| 6080亚洲精品一区二区| 精品免费视频.| 亚洲va欧美va天堂v国产综合| 国产二区国产一区在线观看| 精品久久久久久久久久久院品网| 日韩激情中文字幕| 这里只有精品99re| 捆绑变态av一区二区三区| 欧美一区二区人人喊爽| 日韩在线卡一卡二| 精品久久人人做人人爰| 国产酒店精品激情| 国产精品入口麻豆原神| av动漫一区二区| 成人欧美一区二区三区1314| 91免费看片在线观看| 亚洲一区欧美一区| 精品国产一区二区三区久久影院 | 国产精品久久久久aaaa樱花| 成人av在线观| 日韩专区中文字幕一区二区| 日韩亚洲欧美成人一区| 粉嫩欧美一区二区三区高清影视| 成人欧美一区二区三区1314| 欧美怡红院视频| 美女一区二区三区| 国产精品国产三级国产专播品爱网 | 日韩视频中午一区| 丁香婷婷综合五月| 五月激情六月综合| 国产欧美精品一区aⅴ影院| 一本色道a无线码一区v| 轻轻草成人在线| 亚洲麻豆国产自偷在线| 日韩精品中文字幕在线不卡尤物 | 亚洲综合小说图片| 精品国产伦一区二区三区观看方式| 成人午夜又粗又硬又大| 色老头久久综合| 国产精品911| 老色鬼精品视频在线观看播放| 1区2区3区欧美| 久久久久久一级片| 日韩精品综合一本久道在线视频| 91麻豆文化传媒在线观看| 国产成人亚洲综合a∨婷婷图片 | 本田岬高潮一区二区三区| 免费久久精品视频| 污片在线观看一区二区| 亚洲精品视频免费看| 国产精品剧情在线亚洲| 久久精品一区二区三区不卡牛牛 |