[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libcvd-members] libcvd/cvd_src faster_corner.cxx
From: |
Edward Rosten |
Subject: |
[libcvd-members] libcvd/cvd_src faster_corner.cxx |
Date: |
Fri, 03 Aug 2007 23:13:25 +0000 |
CVSROOT: /cvsroot/libcvd
Module name: libcvd
Changes by: Edward Rosten <edrosten> 07/08/03 23:13:25
Modified files:
cvd_src : faster_corner.cxx
Log message:
Potential fix to faster_corner_10.
WARNING IT MAY BE BROKEN!!!
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libcvd/cvd_src/faster_corner.cxx?cvsroot=libcvd&r1=1.7&r2=1.8
Patches:
Index: faster_corner.cxx
===================================================================
RCS file: /cvsroot/libcvd/libcvd/cvd_src/faster_corner.cxx,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- faster_corner.cxx 25 Jul 2007 20:52:25 -0000 1.7
+++ faster_corner.cxx 3 Aug 2007 23:13:24 -0000 1.8
@@ -154,14 +154,23 @@
{
const int w = I.size().x;
const int stride = 3*w;
- typedef std::list<std::pair<const byte*, unsigned int> > Passed;
- Passed passed;
// The compiler refuses to reserve a register for this
register const __m128i barriers = _mm_set1_epi8((byte)barrier);
const byte* const end = I[I.size().y - 3]-16;
- for (const byte* p = I[3] + 16; p!=end; p+=16) {
+ int xend = I.size().x - 3;
+ xend -= I.size().x % 16;
+
+ for(int y=3; y < I.size().y - 3; y++)
+ {
+ for(int x=3; x < 16; x++)
+ if(is_corner_10<Less>(&I[y][x], I.row_stride(), barrier) ||
is_corner_10<Greater>(&I[y][x], I.row_stride(), barrier))
+ corners.push_back(ImageRef(x, y));
+
+ for(int x=16; x < xend; x++)
+ {
+ const byte* p = &I[y][x];
__m128i lo, hi;
{
const __m128i here = load_si128<Aligned>((const __m128i*)(p));
@@ -265,42 +274,50 @@
if (!possible)
continue;
}
- passed.push_back(make_pair(p,(possible | (possible>>16))&0xFFFF));
- }
- corners.reserve(passed.size());
- int row = 3;
- const byte* row_start = I[3];
- // Check first 16
+
+ //if(possible & 0x0f) //Does this make it faster?
{
- for (int j=3; j<16; ++j)
- if (is_corner_10<Less>(row_start + j, w, row_start[j]-barrier)
||
- is_corner_10<Greater>(row_start + j, w,
row_start[j]+barrier))
- corners.push_back(ImageRef(j,3));
+ if(possible & (1<< 0))
+ corners.push_back(ImageRef(y, x + 0));
+ if(possible & (1<< 1))
+ corners.push_back(ImageRef(y, x + 1));
+ if(possible & (1<< 2))
+ corners.push_back(ImageRef(y, x + 2));
+ if(possible & (1<< 3))
+ corners.push_back(ImageRef(y, x + 3));
+ if(possible & (1<< 4))
+ corners.push_back(ImageRef(y, x + 4));
+ if(possible & (1<< 5))
+ corners.push_back(ImageRef(y, x + 5));
+ if(possible & (1<< 6))
+ corners.push_back(ImageRef(y, x + 6));
+ if(possible & (1<< 7))
+ corners.push_back(ImageRef(y, x + 7));
+ }
+ //if(possible & 0xf0) //Does this mak( , fast)r?
+ {
+ if(possible & (1<< 8))
+ corners.push_back(ImageRef(y, x + 8));
+ if(possible & (1<< 9))
+ corners.push_back(ImageRef(y, x + 9));
+ if(possible & (1<<10))
+ corners.push_back(ImageRef(y, x +10));
+ if(possible & (1<<11))
+ corners.push_back(ImageRef(y, x +11));
+ if(possible & (1<<12))
+ corners.push_back(ImageRef(y, x +12));
+ if(possible & (1<<13))
+ corners.push_back(ImageRef(y, x +13));
+ if(possible & (1<<14))
+ corners.push_back(ImageRef(y, x +14));
+ if(possible & (1<<15))
+ corners.push_back(ImageRef(y, x +15));
}
- for (Passed::iterator it = passed.begin(); it != passed.end(); ++it) {
- while (it->first >= row_start + w) {
- ++row;
- row_start += w;
}
- int x = it->first - row_start;
- unsigned int bits = it->second;
- if (x == 0) {
- x = 3;
- bits >>= 3;
- } else if (x >= w-18)
- bits &= 0x1FFF;
- for (;bits;bits>>=1, ++x) {
- if (bits&0x1)
- corners.push_back(ImageRef(x,row));
- }
- }
- // Check last 16
- {
- row_start = I[I.size().y-4];
- for (int j=w-16; j<w-3; ++j)
- if (is_corner_10<Less>(row_start + j, w, row_start[j]-barrier)
||
- is_corner_10<Greater>(row_start + j, w,
row_start[j]+barrier))
- corners.push_back(ImageRef(j,I.size().y-4));
+
+ for(int x=xend; x < I.size().x - 3; x++)
+ if(is_corner_10<Less>(&I[y][x], I.row_stride(), barrier) ||
is_corner_10<Greater>(&I[y][x], I.row_stride(), barrier))
+ corners.push_back(ImageRef(x, y));
}
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [libcvd-members] libcvd/cvd_src faster_corner.cxx,
Edward Rosten <=