⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 programcg.cpp

📁 SiftGPU is an implementation of SIFT [1] for GPU. SiftGPU processes pixels parallely to build Gaussi
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	"		v6.x = texRECT(texD, TexLD.xy).g;\n"
	"		v6.y = texRECT(texD, TexLU.xy).g;\n"
	"		v6.z = texRECT(texD, TexRD.xy).g;\n"
	"		v6.w = texRECT(texD, TexRU.xy).g;\n"
	"		if(cc.g < v3.y || any(cc.gggg<v5.xyzw || cc.gggg<v6.xyzw))return; \n"
	"		dog = 1.0; \n"
	"	}\n"
	//the minimum case
	<<
	"  else if(cc.g < -THRESHOLD0 && all(cc.gggg < min(v1, v2)))\n"
	"  {\n"
	"		v3.x = texRECT(texU, TexCC.xy).g;\n"
	"		v4.x = texRECT(texU, TexLC.xy).g;\n"
	"		v4.y = texRECT(texU, TexRC.xy).g;\n"
	"		v4.z = texRECT(texU, TexCD.xy).g;\n"
	"		v4.w = texRECT(texU, TexCU.xy).g;\n"
	"		v6.x = texRECT(texU, TexLD.xy).g;\n"
	"		v6.y = texRECT(texU, TexLU.xy).g;\n"
	"		v6.z = texRECT(texU, TexRD.xy).g;\n"
	"		v6.w = texRECT(texU, TexRU.xy).g;\n"
	"		if(cc.g > v3.x || any(cc.gggg>v4.xyzw || cc.gggg>v6.xyzw))return; \n"
	"		v3.y = texRECT(texD, TexCC.xy).g;\n"
	"		v5.x = texRECT(texD, TexLC.xy).g;\n"
	"		v5.y = texRECT(texD, TexRC.xy).g;\n"
	"		v5.z = texRECT(texD, TexCD.xy).g;\n"
	"		v5.w = texRECT(texD, TexCU.xy).g;\n"
	"		v6.x = texRECT(texD, TexLD.xy).g;\n"
	"		v6.y = texRECT(texD, TexLU.xy).g;\n"
	"		v6.z = texRECT(texD, TexRD.xy).g;\n"
	"		v6.w = texRECT(texD, TexRU.xy).g;\n"
	"		if(cc.g > v3.y || any(cc.gggg>v5.xyzw || cc.gggg>v6.xyzw))return; \n"
	"		dog = 0.5 ; \n"
	"	}\n"
	"	else\n"
	"		return;\n"
	<<
	"  int i = 0; \n"
	"  float2 offset = float2(0, 0);\n"
	"  float2 offsets = float2(0, 0);\n"
	"  float3 dxys;		bool key_moved;	\n"
	"  float fx, fy, fs; \n"
	"  float fxx, fyy, fxy; \n"
	"  float fxs, fys, fss; \n"
	"  do\n"
	"  {\n"
	"	dxys = float3(0, 0, 0);\n"
	"	offset = float2(0, 0);\n"
	"	float4 D2 = v1.xyzw - cc.gggg;\n"
	"	fxx = D2.x + D2.y;\n"
	"	fyy = D2.z + D2.w;\n"
	"	float2 D4 = v2.xw - v2.yz;\n"
	"	fxy = 0.25*(D4.x + D4.y);\n"
	"	float2 D5 = 0.5*(v1.yw-v1.xz); \n"
	"	fx = D5.x;\n"
	"	fy = D5.y ; \n"
	"	fs = 0.5*( v3.x - v3.y ); \n"
	"	fss = v3.x + v3.y - cc.g - cc.g;\n"
	"	fxs = 0.25 * ( v4.y + v5.x - v4.x - v5.y);\n"
	"	fys = 0.25 * ( v4.w + v5.z - v4.z - v5.w);\n"
	"	float4 A0, A1, A2 ;			\n"
	"	A0 = float4(fxx, fxy, fxs, -fx);	\n"
	"	A1 = float4(fxy, fyy, fys, -fy);	\n"
	"	A2 = float4(fxs, fys, fss, -fs);	\n"
	"	float3 x3 = abs(float3(fxx, fxy, fxs));		\n"
	"	float maxa = max(max(x3.x, x3.y), x3.z);	\n"
	"	if(maxa > 1e-10 )							\n"
	"	{\n"
	"		if(x3.y ==maxa )							\n"
	"		{											\n"
	"			float4 TEMP = A1; A1 = A0; A0 = TEMP;	\n"
	"		}else if( x3.z == maxa )					\n"
	"		{											\n"
	"			float4 TEMP = A2; A2 = A0; A0 = TEMP;	\n"
	"		}											\n"
	"		A0 /= A0.x;									\n"
	"		A1 -= A1.x * A0;							\n"
	"		A2 -= A2.x * A0;							\n"
	"		float2 x2 = abs(float2(A1.y, A2.y));		\n"
	"		if( x2.y > x2.x )							\n"
	"		{											\n"
	"			float3 TEMP = A2.yzw;					\n"
	"			A2.yzw = A1.yzw;						\n"
	"			A1.yzw = TEMP;							\n"
	"			x2.x = x2.y;							\n"
	"		}											\n"
	"		if(x2.x > 1e-10)							\n"
	"		{\n"
	"			A1.yzw /= A1.y;							\n"
	"			A2.yzw -= A2.y * A1.yzw;				\n"
	"			if(abs(A2.z) > 1e-10)					\n"
	"			{\n"
	// compute dx, dy, ds: 
	<<
	"				dxys.z = A2.w /A2.z;						\n"
	"				dxys.y = A1.w - dxys.z*A1.z;			    \n"
	"				dxys.x = A0.w - dxys.z*A0.z - dxys.y*A0.y;	\n"
	"			}\n"
	"		}\n"
	"	}\n"
	"	offset.x = dxys.x > 0.6 ? 1 : 0 + dxys.x < -0.6 ? -1 : 0;\n"
	"	offset.y = dxys.y > 0.6 ? 1 : 0 + dxys.y < - 0.6? -1 : 0;\n"
	"	i++; key_moved = i < MAX_REFINE && any(abs(offset)>0) ;	\n"
	"	if(key_moved)\n"
	"	{\n"
	"		offsets += offset; \n"
	"	    cc  =  texRECT(tex, TexCC.xy  + offsets);\n"
	"		v1.x = texRECT(tex , TexLC.xy + offsets).g;\n"
	"		v1.y = texRECT(tex , TexRC.xy + offsets).g;\n"
	"		v1.z = texRECT(tex , TexCD.xy + offsets).g;\n"
	"		v1.w = texRECT(tex , TexCU.xy + offsets).g;\n"
	"		v2.x = texRECT(tex , TexLD.xy + offsets).g;\n"
	"		v2.y = texRECT(tex , TexLU.xy + offsets).g;\n"
	"		v2.z = texRECT(tex , TexRD.xy + offsets).g;\n"
	"		v2.w = texRECT(tex , TexRU.xy + offsets).g;\n"
	"		v3.x = texRECT(texU, TexCC.xy + offsets).g;\n"
	"		v4.x = texRECT(texU, TexLC.xy + offsets).g;\n"
	"		v4.y = texRECT(texU, TexRC.xy + offsets).g;\n"
	"		v4.z = texRECT(texU, TexCD.xy + offsets).g;\n"
	"		v4.w = texRECT(texU, TexCU.xy + offsets).g;\n"
	"		v3.y = texRECT(texD, TexCC.xy + offsets).g;\n"
	"		v5.x = texRECT(texD, TexLC.xy + offsets).g;\n"
	"		v5.y = texRECT(texD, TexRC.xy + offsets).g;\n"
	"		v5.z = texRECT(texD, TexCD.xy + offsets).g;\n"
	"		v5.w = texRECT(texD, TexCU.xy + offsets).g;\n"
	"	}\n"
	"  }while(key_moved);\n"
	  <<
	"  bool test1 = (abs(cc.g + 0.5*dot(float3(fx, fy, fs), dxys ))> THRESHOLD1) ;\n"
	"  float test2_v1= fxx*fyy - fxy *fxy; \n"
	"  float test2_v2 = (fxx+fyy); \n"
	"  test2_v2 = test2_v2*test2_v2;\n"
	"  bool test2 = test2_v1>0 && test2_v2 < THRESHOLD2 * test2_v1; \n "
    //keep the point when the offset is less than 1
	<<
	"  FragData1 = test1 && test2 && all( abs(dxys) < 1)? float4( dog, dxys.xy+offsets, dxys.z) : float4(0, 0, 0, 0); \n"
	"}\n"	
	<<'\0';

	ProgramCG * program; 
	s_keypoint = program = new ProgramCG(buffer);
	//parameter
	_param_dog_texu = cgGetNamedParameter(*program, "texU");
	_param_dog_texd = cgGetNamedParameter(*program, "texD");

	return 1;

}

//keypoint detection shader
//1. compare with 26 neighbours
//2. sub-pixel sub-scale localization
//3. output: [dog, offset(x,y,s)]

void ShaderBagCG:: LoadKeypointShader(float threshold, float edge_threshold)
{
	char buffer[10240];
	float threshold0 = threshold* (GlobalUtil::_SubpixelLocalization?0.8f:1.0f);
	float threshold1 = threshold;
	float threshold2 = (edge_threshold+1)*(edge_threshold+1)/edge_threshold;
	ostrstream out(buffer, 10240);
	out<<setprecision(8);
	streampos pos;
	//tex(X)(Y)
	//X: (CLR) (CENTER 0, LEFT -1, RIGHT +1)  
	//Y: (CDU) (CENTER 0, DOWN -1, UP    +1) 

	out <<	"#define THRESHOLD0 " << threshold0 << "\n"
			"#define THRESHOLD1 " << threshold1 << "\n"
			"#define THRESHOLD2 " << threshold2 << "\n";
	out<<
	"void main (\n"
	"float4 TexCC : TEXCOORD0, float4 TexLC : TEXCOORD1,\n"
	"float4 TexRC : TEXCOORD2, float4 TexCD : TEXCOORD3, \n"
	"float4 TexCU : TEXCOORD4, float4 TexLD : TEXCOORD5, \n"
	"float4 TexLU : TEXCOORD6, float4 TexRD : TEXCOORD7,\n"
	"out float4 FragData0 : COLOR0, out float4 FragData1 : COLOR1, \n"
	"uniform samplerRECT tex, uniform samplerRECT texU, uniform samplerRECT texD)\n"
	"{\n"
	"	float4 v1, v2, gg;\n"
	"	float2 TexRU = float2(TexRC.x, TexCU.y); \n"
	"	float4 cc  = texRECT(tex, TexCC.xy);\n"
	"	v1.x = texRECT(tex, TexLC.xy).g;\n"
	"	gg.x = texRECT(tex, TexLC.xy).r;\n"
	"	v1.y = texRECT(tex, TexRC.xy).g;\n"
	"	gg.y = texRECT(tex, TexRC.xy).r;\n"
	"	v1.z = texRECT(tex, TexCD.xy).g;\n"
	"	gg.z = texRECT(tex, TexCD.xy).r;\n"
	"	v1.w = texRECT(tex, TexCU.xy).g;\n"
	"	gg.w = texRECT(tex, TexCU.xy).r;\n"
	"	v2.x = texRECT(tex, TexLD.xy).g;\n"
	"	v2.y = texRECT(tex, TexLU.xy).g;\n"
	"	v2.z = texRECT(tex, TexRD.xy).g;\n"
	"	v2.w = texRECT(tex, TexRU.xy).g;\n"
	"	float2 dxdy = (gg.yw - gg.xz); \n"
	"	float grad = 0.5*length(dxdy);\n"
	"	float theta = grad==0? 0: atan2(dxdy.y, dxdy.x);\n"
	"	FragData0 = float4(cc.rg, grad, theta);\n"

	//test against 8 neighbours
	//use variable to identify type of extremum
	//1.0 for local maximum and 0.5 for minimum
	<<
	"	float dog = 0.0; \n"
	"	FragData1 = float4(0, 0, 0, 0); \n"
	"	dog = cc.g > THRESHOLD0 && all(cc.gggg > max(v1, v2))?1.0: 0.0;\n"
	"	dog = cc.g < -THRESHOLD0 && all(cc.gggg < min(v1, v2))?0.5: dog;\n";

	pos = out.tellp();
	//do edge supression first.. 
	//vector v1 is < (-1, 0), (1, 0), (0,-1), (0, 1)>
	//vector v2 is < (-1,-1), (-1,1), (1,-1), (1, 1)>

	out<<
	"	if(dog == 0.0) return;\n"
	"	float fxx, fyy, fxy; \n"
	"	float4 D2 = v1.xyzw - cc.gggg;\n"
	"	float2 D4 = v2.xw - v2.yz;\n"
	"	fxx = D2.x + D2.y;\n"
	"	fyy = D2.z + D2.w;\n"
	"	fxy = 0.25*(D4.x + D4.y);\n"
	"	float fxx_plus_fyy = fxx + fyy;\n"
	"	float score_up = fxx_plus_fyy*fxx_plus_fyy; \n"
	"	float score_down = (fxx*fyy - fxy*fxy);\n"
	"	if( score_down <= 0 || score_up > THRESHOLD2 * score_down)return;\n"
	//...
	<<
	"	float2 D5 = 0.5*(v1.yw-v1.xz); \n"
	"	float fx = D5.x, fy = D5.y ; \n"
	"	float fs, fss , fxs, fys ; \n"
	"	float2 v3; float4 v4, v5, v6;\n"
	//read 9 pixels of upper level
	<<
	"	v3.x = texRECT(texU, TexCC.xy).g;\n"
	"	v4.x = texRECT(texU, TexLC.xy).g;\n"
	"	v4.y = texRECT(texU, TexRC.xy).g;\n"
	"	v4.z = texRECT(texU, TexCD.xy).g;\n"
	"	v4.w = texRECT(texU, TexCU.xy).g;\n"
	"	v6.x = texRECT(texU, TexLD.xy).g;\n"
	"	v6.y = texRECT(texU, TexLU.xy).g;\n"
	"	v6.z = texRECT(texU, TexRD.xy).g;\n"
	"	v6.w = texRECT(texU, TexRU.xy).g;\n"
	//compare with 9 pixels of upper level
	//read and compare with 9 pixels of lower level
	//the maximum case
	<<
	"	if(dog == 1.0)\n"
	"	{\n"
	"		bool4 test = cc.gggg < max(v4, v6); \n"
	"		if(cc.g < v3.x || any(test.xy||test.zw))return; \n"
	"		v3.y = texRECT(texD, TexCC.xy).g;\n"
	"		v5.x = texRECT(texD, TexLC.xy).g;\n"
	"		v5.y = texRECT(texD, TexRC.xy).g;\n"
	"		v5.z = texRECT(texD, TexCD.xy).g;\n"
	"		v5.w = texRECT(texD, TexCU.xy).g;\n"
	"		v6.x = texRECT(texD, TexLD.xy).g;\n"
	"		v6.y = texRECT(texD, TexLU.xy).g;\n"
	"		v6.z = texRECT(texD, TexRD.xy).g;\n"
	"		v6.w = texRECT(texD, TexRU.xy).g;\n"
	"		test = cc.gggg<max(v5, v6); \n"
	"		if(cc.g < v3.y || any(test.xy||test.zw))return; \n"
	"	}\n"
	//the minimum case
	<<
	"	else{\n"
	"		bool4 test = cc.gggg>min(v4, v6); \n"
	"		if(cc.g > v3.x || any(test.xy||test.zw))return; \n"
	"		v3.y = texRECT(texD, TexCC.xy).g;\n"
	"		v5.x = texRECT(texD, TexLC.xy).g;\n"
	"		v5.y = texRECT(texD, TexRC.xy).g;\n"
	"		v5.z = texRECT(texD, TexCD.xy).g;\n"
	"		v5.w = texRECT(texD, TexCU.xy).g;\n"
	"		v6.x = texRECT(texD, TexLD.xy).g;\n"
	"		v6.y = texRECT(texD, TexLU.xy).g;\n"
	"		v6.z = texRECT(texD, TexRD.xy).g;\n"
	"		v6.w = texRECT(texD, TexRU.xy).g;\n"
	"		test = cc.gggg>min(v5, v6); \n"
	"		if(cc.g > v3.y || any(test.xy||test.zw))return; \n"
	"	}\n";

	if(GlobalUtil::_SubpixelLocalization)

	// sub-pixel localization FragData1 = float4(dog, 0, 0, 0); return;
	out <<
	"	fs = 0.5*( v3.x - v3.y ); //bug fix 9/12/2007 \n"
	"	fss = v3.x + v3.y - cc.g - cc.g;\n"
	"	fxs = 0.25 * ( v4.y + v5.x - v4.x - v5.y);\n"
	"	fys = 0.25 * ( v4.w + v5.z - v4.z - v5.w);\n"
	
	///////////////////////////////////////////////////////////////// 
	// let dog difference be quatratic function  of dx, dy, ds; 
	// df(dx, dy, ds) = fx * dx + fy*dy + fs * ds + 
	//				  + 0.5 * ( fxx * dx * dx + fyy * dy * dy + fss * ds * ds)
	//				  + (fxy * dx * dy + fxs * dx * ds + fys * dy * ds)
	// (fx, fy, fs, fxx, fyy, fss, fxy, fxs, fys are the derivatives)
	
	//the local extremum satisfies
	// df/dx = 0, df/dy = 0, df/dz = 0
	
	//that is 
	// |-fx|     | fxx fxy fxs |   |dx|
	// |-fy|  =  | fxy fyy fys | * |dy|
	// |-fs|     | fxs fys fss |   |ds|
	// need to solve dx, dy, ds

	// Use Gauss elimination to solve the linear system
    <<
	"	float3 dxys = float3(0.0);			\n"
	"	float4 A0, A1, A2 ;			\n"
	"	A0 = float4(fxx, fxy, fxs, -fx);	\n"
	"	A1 = float4(fxy, fyy, fys, -fy);	\n"
	"	A2 = float4(fxs, fys, fss, -fs);	\n"
	"	float3 x3 = abs(float3(fxx, fxy, fxs));		\n"
	"	float maxa = max(max(x3.x, x3.y), x3.z);	\n"
	"	if(maxa >= 1e-10 ) {						\n"
	"	if(x3.y ==maxa )							\n"
	"	{											\n"
	"		float4 TEMP = A1; A1 = A0; A0 = TEMP;	\n"
	"	}else if( x3.z == maxa )					\n"
	"	{											\n"
	"		float4 TEMP = A2; A2 = A0; A0 = TEMP;	\n"
	"	}											\n"
	"	A0 /= A0.x;									\n"
	"	A1 -= A1.x * A0;							\n"
	"	A2 -= A2.x * A0;							\n"
	"	float2 x2 = abs(float2(A1.y, A2.y));		\n"
	"	if( x2.y > x2.x )							\n"
	"	{											\n"
	"		float3 TEMP = A2.yzw;					\n"
	"		A2.yzw = A1.yzw;						\n"
	"		A1.yzw = TEMP;							\n"
	"		x2.x = x2.y;							\n"
	"	}											\n"
	"	if(x2.x >= 1e-10) {						\n"
	"	A1.yzw /= A1.y;								\n"
	"	A2.yzw -= A2.y * A1.yzw;					\n"
	"	if(abs(A2.z) >= 1e-10) {				\n"
	// compute dx, dy, ds: 
	<<
	"	dxys.z = A2.w /A2.z;				    \n"
	"	dxys.y = A1.w - dxys.z*A1.z;			    \n"
	"	dxys.x = A0.w - dxys.z*A0.z - dxys.y*A0.y;	\n"

	//one more threshold which I forgot in  versions prior to 286
	<<
	"	bool bugfix_test = (abs(cc.g + 0.5*dot(float3(fx, fy, fs), dxys )) < THRESHOLD1) ;\n"
	"	if(bugfix_test || any(abs(dxys) >= 1.0)) dog = 0; \n"
	"	}}}\n"
    //keep the point when the offset is less than 1
	<<
	"	FragData1 = float4( dog, dxys); \n"
	"}\n"	<<'\0';

	else		out<<
	"	FragData1 =  float4( dog, 0, 0, 0) ;	\n"
	"}\n"	<<'\0';

	ProgramCG * program; 
	s_keypoint = program = new ProgramCG(buffer);
	if(!program->IsValidProgram())
	{
		delete program;
		out.seekp(pos);
		out << 
	"	FragData1 =  float4( fabs(cc.g) > 2.0 * THRESHOLD0? dog : 0, 0, 0, 0) ;	\n"
	"}\n" <<'\0';
		s_keypoint = program = new ProgramCG(buffer);
		GlobalUtil::_SubpixelLocalization = 0;
		std::cerr<<"Detection simplified on this hardware"<<endl;
	}
	//parameter
	_param_dog_texu = cgGetNamedParameter(*program, "texU");
	_param_dog_texd = cgGetNamedParameter(*program, "texD");




}


void ShaderBagCG::SetDogTexParam(int texU, int texD)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -