28 #include <fvutils/color/zauberstab.h> 29 #include <fvutils/color/yuv.h> 30 #include <core/macros.h> 51 slices =
new vector<ZSlice*>();
58 for (std::vector<ZSlice*>::iterator it = slices->begin(); it != slices->end(); ++it)
71 for (std::vector<ZSlice*>::iterator it = slices->begin(); it != slices->end(); ++it)
84 Zauberstab::Zauberstab() {
99 Zauberstab::~Zauberstab() {
108 Zauberstab::setThreshold(
unsigned int t) {
117 Zauberstab::getThreshold() {
118 return this->threshold;
128 Zauberstab::setBuffer(
unsigned char *b,
141 Zauberstab::isEmptyRegion() {
142 return (region->slices->size() == 0);
148 Zauberstab::deleteRegion() {
157 Zauberstab::deleteRegion(
unsigned int seedX,
unsigned int seedY)
161 ZRegion* region2 = privFindRegion (seedX, seedY);
165 deleteRegion(region2);
181 while (region2->
slices->size())
185 nSlice = region2->
slices->back();
186 region2->
slices->pop_back();
187 int heightOfSlice = nSlice->
y;
190 unsigned int size = region->slices->size();
194 oSlice = region->slices->at(i);
195 if (oSlice->
y == heightOfSlice)
207 region->slices->erase(region->slices->begin() + i);
229 newPart->
y = heightOfSlice;
232 region->slices->push_back(newPart);
248 Zauberstab::privFindRegion (
unsigned int seedX,
unsigned int seedY)
250 unsigned char py __unused;
251 unsigned char pu = 0;
252 unsigned char pv = 0;
265 unsigned int uSeed = 0;
266 unsigned int vSeed = 0;
267 unsigned int cnt = 0;
269 for (
int x = seedX - 2; x <= (int)seedX + 2; ++x) {
271 if ((
unsigned int )x >= width)
continue;
272 for (
int y = seedY - 2; y <= (int)seedY + 2; ++y) {
274 if ((
unsigned int)y >= height)
continue;
275 YUV422_PLANAR_YUV(buffer, width, height, x, y, py, pu, pv);
290 tmp = findSlice(seedX, seedY, vSeed, uSeed);
291 region2->
slices->push_back(tmp);
299 tmp = region2->
slices->front();
300 int tmpY = ((int)seedY >= (
int)(height - 1)) ? height -1 : seedY + 1;
302 int tmpX = int(
float(tmp->
leftX + tmp->
rightX) / 2.0);
304 YUV422_PLANAR_YUV(buffer, width, height, tmpX, tmpY, py, pu, pv);
305 while (isSimilarUV(pu, uSeed, pv, vSeed)) {
306 tmp = findSlice(tmpX, tmpY, vSeed, uSeed);
307 region2->
slices->push_back(tmp);
311 if (tmpY >= (
int)this->height) {
314 YUV422_PLANAR_YUV(buffer, width, height, tmpX, tmpY, py, pu, pv);
320 tmp = region2->
slices->front();
321 tmpY = (seedY == 0) ? 0 : seedY - 1;
325 YUV422_PLANAR_YUV(buffer, width, height, tmpX, tmpY, py, pu, pv);
326 while (isSimilarUV(pu, uSeed, pv, vSeed)) {
327 tmp = findSlice(tmpX, tmpY, vSeed, uSeed);
328 region2->
slices->push_back(tmp);
335 YUV422_PLANAR_YUV(buffer, width, height, tmpX, tmpY, py, pu, pv);
341 for (std::vector<ZSlice*>::iterator it = region2->
slices->begin(); it != region2->
slices->end(); ++it)
343 cout <<
"start x: " << ((*it)->leftX) <<
" end x: " << ((*it)->rightX) <<
" y: " << ((*it)->y) << endl;
354 Zauberstab::findRegion(
unsigned int seedX,
unsigned int seedY) {
355 if (buffer == NULL)
return;
356 if (width == 0)
return;
357 if (height == 0)
return;
360 region = privFindRegion(seedX, seedY);
369 Zauberstab::addRegion(
unsigned int seedX,
unsigned int seedY)
373 ZRegion* region2 = privFindRegion (seedX, seedY);
390 Zauberstab::findSlice(
unsigned int x,
unsigned int y,
391 unsigned int vSeed,
int uSeed)
399 unsigned char py __unused;
404 if ((
unsigned int)tmpX < width)
406 YUV422_PLANAR_YUV(buffer, width, height, tmpX, y, py, pu, pv);
409 while (uSeed >= 0 ? isSimilarUV(pu, uSeed, pv, vSeed) : isSimilarV(pv, vSeed)) {
412 if (tmpX >= (
int)this->width) {
415 YUV422_PLANAR_YUV(buffer, width, height, tmpX, y, py, pu, pv);
424 YUV422_PLANAR_YUV(buffer, width, height, tmpX, y, py, pu, pv);
425 while (uSeed >= 0 ? isSimilarUV(pu, uSeed, pv, vSeed) : isSimilarV(pv, vSeed)) {
431 YUV422_PLANAR_YUV(buffer, width, height, tmpX, y, py, pu, pv);
455 while (region2->
slices->size())
459 nSlice = region2->
slices->back();
460 region2->
slices->pop_back();
461 int heightOfSlice = nSlice->
y;
465 while(i < region->slices->size())
467 oSlice = region->slices->at(i);
468 if (oSlice->
y == heightOfSlice)
480 region->slices->erase(region->slices->begin() + i);
492 region->slices->push_back(nSlice);
503 Zauberstab::isSimilarV(
unsigned int v1,
505 return ( (
unsigned int)abs((
int)v1 - (
int)v2) > this->threshold ) ? false :
true;
515 Zauberstab::isSimilarU(
unsigned int u1,
517 return ( (
unsigned int)abs((
int)u1 - (
int)u2) > this->threshold ) ? false :
true;
529 Zauberstab::isSimilarUV(
unsigned int u1,
unsigned int u2,
530 unsigned int v1,
unsigned int v2)
532 return isSimilarU(u1, u2) && isSimilarV(v1, v2);
540 Zauberstab::getRegion()
const 549 vector< rectangle_t >
550 Zauberstab::getSelection()
553 vector< rectangle_t > rv;
556 std::vector< ZSlice *>::iterator it;
557 for (it = region->slices->begin(); it != region->slices->end(); it++) {
559 rect.
start.
x = (*it)->leftX;
561 rect.
extent.
w = (*it)->rightX - (*it)->leftX;
563 rv.push_back( rect );
Fawkes library namespace.
unsigned int y
y coordinate
unsigned int x
x coordinate
Rectangle (unsigned integers)
upoint_t start
start point
std::vector< ZSlice * > * slices
slices
a region is a stack of slices, together with the y-position of the slice at the top ...
a "slice" is a row of consecutive pixels (horizontal)