28 #include <core/macros.h> 29 #include <fvutils/color/yuv.h> 30 #include <fvutils/color/zauberstab.h> 38 namespace firevision {
48 slices =
new vector<ZSlice *>();
55 for (std::vector<ZSlice *>::iterator it = slices->begin(); it != slices->end(); ++it) {
67 for (std::vector<ZSlice *>::iterator it = slices->begin(); it != slices->end(); ++it) {
79 Zauberstab::Zauberstab()
94 Zauberstab::~Zauberstab()
103 Zauberstab::setThreshold(
unsigned int t)
112 Zauberstab::getThreshold()
114 return this->threshold;
123 Zauberstab::setBuffer(
unsigned char *b,
unsigned int w,
unsigned int h)
134 Zauberstab::isEmptyRegion()
136 return (region->slices->size() == 0);
141 Zauberstab::deleteRegion()
151 Zauberstab::deleteRegion(
unsigned int seedX,
unsigned int seedY)
155 ZRegion *region2 = privFindRegion(seedX, seedY);
159 deleteRegion(region2);
174 while (region2->
slices->size()) {
177 nSlice = region2->
slices->back();
178 region2->
slices->pop_back();
179 int heightOfSlice = nSlice->
y;
182 unsigned int size = region->slices->size();
186 oSlice = region->slices->at(i);
187 if (oSlice->
y == heightOfSlice)
196 region->slices->erase(region->slices->begin() + i);
214 newPart->
y = heightOfSlice;
217 region->slices->push_back(newPart);
233 Zauberstab::privFindRegion(
unsigned int seedX,
unsigned int seedY)
235 unsigned char py __unused;
236 unsigned char pu = 0;
237 unsigned char pv = 0;
250 unsigned int uSeed = 0;
251 unsigned int vSeed = 0;
252 unsigned int cnt = 0;
254 for (
int x = seedX - 2; x <= (int)seedX + 2; ++x) {
257 if ((
unsigned int)x >= width)
259 for (
int y = seedY - 2; y <= (int)seedY + 2; ++y) {
262 if ((
unsigned int)y >= height)
264 YUV422_PLANAR_YUV(buffer, width, height, x, y, py, pu, pv);
278 tmp = findSlice(seedX, seedY, vSeed, uSeed);
279 region2->
slices->push_back(tmp);
287 tmp = region2->
slices->front();
288 int tmpY = ((int)seedY >= (
int)(height - 1)) ? height - 1 : seedY + 1;
290 int tmpX = int(
float(tmp->leftX + tmp->rightX) / 2.0);
292 YUV422_PLANAR_YUV(buffer, width, height, tmpX, tmpY, py, pu, pv);
293 while (isSimilarUV(pu, uSeed, pv, vSeed)) {
294 tmp = findSlice(tmpX, tmpY, vSeed, uSeed);
295 region2->
slices->push_back(tmp);
297 tmpX = int(
float(tmp->leftX + tmp->rightX) / 2.0);
299 if (tmpY >= (
int)this->height) {
302 YUV422_PLANAR_YUV(buffer, width, height, tmpX, tmpY, py, pu, pv);
308 tmp = region2->
slices->front();
309 tmpY = (seedY == 0) ? 0 : seedY - 1;
311 tmpX = int(
float(tmp->leftX + tmp->rightX) / 2.0);
313 YUV422_PLANAR_YUV(buffer, width, height, tmpX, tmpY, py, pu, pv);
314 while (isSimilarUV(pu, uSeed, pv, vSeed)) {
315 tmp = findSlice(tmpX, tmpY, vSeed, uSeed);
316 region2->
slices->push_back(tmp);
318 tmpX = int(
float(tmp->leftX + tmp->rightX) / 2.0);
323 YUV422_PLANAR_YUV(buffer, width, height, tmpX, tmpY, py, pu, pv);
329 for (std::vector<ZSlice *>::iterator it = region2->
slices->begin(); it != region2->
slices->end();
331 cout <<
"start x: " << ((*it)->leftX) <<
" end x: " << ((*it)->rightX) <<
" y: " << ((*it)->y)
343 Zauberstab::findRegion(
unsigned int seedX,
unsigned int seedY)
353 region = privFindRegion(seedX, seedY);
361 Zauberstab::addRegion(
unsigned int seedX,
unsigned int seedY)
365 ZRegion *region2 = privFindRegion(seedX, seedY);
381 Zauberstab::findSlice(
unsigned int x,
unsigned int y,
unsigned int vSeed,
int uSeed)
389 unsigned char py __unused;
390 unsigned char pu = 0;
391 unsigned char pv = 0;
394 if ((
unsigned int)tmpX < width) {
395 YUV422_PLANAR_YUV(buffer, width, height, tmpX, y, py, pu, pv);
398 while (uSeed >= 0 ? isSimilarUV(pu, uSeed, pv, vSeed) : isSimilarV(pv, vSeed)) {
401 if (tmpX >= (
int)this->width) {
404 YUV422_PLANAR_YUV(buffer, width, height, tmpX, y, py, pu, pv);
412 YUV422_PLANAR_YUV(buffer, width, height, tmpX, y, py, pu, pv);
413 while (uSeed >= 0 ? isSimilarUV(pu, uSeed, pv, vSeed) : isSimilarV(pv, vSeed)) {
419 YUV422_PLANAR_YUV(buffer, width, height, tmpX, y, py, pu, pv);
442 while (region2->
slices->size()) {
445 nSlice = region2->
slices->back();
446 region2->
slices->pop_back();
447 int heightOfSlice = nSlice->
y;
451 while (i < region->slices->size())
453 oSlice = region->slices->at(i);
454 if (oSlice->
y == heightOfSlice)
463 region->slices->erase(region->slices->begin() + i);
475 region->slices->push_back(nSlice);
485 Zauberstab::isSimilarV(
unsigned int v1,
unsigned int v2)
487 return ((
unsigned int)abs((
int)v1 - (
int)v2) > this->threshold) ? false :
true;
496 Zauberstab::isSimilarU(
unsigned int u1,
unsigned int u2)
498 return ((
unsigned int)abs((
int)u1 - (
int)u2) > this->threshold) ? false :
true;
509 Zauberstab::isSimilarUV(
unsigned int u1,
unsigned int u2,
unsigned int v1,
unsigned int v2)
511 return isSimilarU(u1, u2) && isSimilarV(v1, v2);
518 Zauberstab::getRegion()
const 527 Zauberstab::getSelection()
529 vector<rectangle_t> rv;
532 std::vector<ZSlice *>::iterator it;
533 for (it = region->slices->begin(); it != region->slices->end(); it++) {
535 rect.
start.
x = (*it)->leftX;
537 rect.
extent.
w = (*it)->rightX - (*it)->leftX;
std::vector< ZSlice * > * slices
slices
Fawkes library namespace.
unsigned int y
y coordinate
unsigned int x
x coordinate
Rectangle (unsigned integers)
upoint_t start
start point
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)