📄 programcg.cpp
字号:
" 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 + -