28#include <core/macros.h>
29#include <fvutils/color/yuv.h>
30#include <fvutils/color/zauberstab.h>
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) {
114 return this->threshold;
136 return (region->
slices->size() == 0);
155 ZRegion *region2 = privFindRegion(seedX, seedY);
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)
214 newPart->
y = heightOfSlice;
217 region->
slices->push_back(newPart);
233Zauberstab::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)
353 region = privFindRegion(seedX, seedY);
365 ZRegion *region2 = privFindRegion(seedX, seedY);
381Zauberstab::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)
475 region->
slices->push_back(nSlice);
485Zauberstab::isSimilarV(
unsigned int v1,
unsigned int v2)
487 return ((
unsigned int)abs((
int)v1 - (
int)v2) > this->threshold) ? false :
true;
496Zauberstab::isSimilarU(
unsigned int u1,
unsigned int u2)
498 return ((
unsigned int)abs((
int)u1 - (
int)u2) > this->threshold) ? false :
true;
509Zauberstab::isSimilarUV(
unsigned int u1,
unsigned int u2,
unsigned int v1,
unsigned int v2)
511 return isSimilarU(u1, u2) && isSimilarV(v1, v2);
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;
a region is a stack of slices, together with the y-position of the slice at the top
std::vector< ZSlice * > * slices
slices
void clear()
Clears all slices.
virtual ~ZRegion()
Constructor.
ZRegion * getRegion() const
Get region.
void findRegion(unsigned int seedX, unsigned int seedY)
Find region.
void setThreshold(unsigned int t)
Set threshold.
std::vector< fawkes::rectangle_t > getSelection()
Get selection.
void deleteRegion()
Delete all regions.
void addRegion(unsigned int seedX, unsigned int seedY)
Add region.
unsigned int getThreshold()
Get threshold.
void setBuffer(unsigned char *b, unsigned int w, unsigned int h)
Set buffer to work on.
bool isEmptyRegion()
Check if region is empty.
Fawkes library namespace.
Rectangle (unsigned integers)
upoint_t start
start point
unsigned int x
x coordinate
unsigned int y
y coordinate
a "slice" is a row of consecutive pixels (horizontal)