112 lines
3.1 KiB
C++
112 lines
3.1 KiB
C++
//
|
|
// begin license header
|
|
//
|
|
// This file is part of Pixy CMUcam5 or "Pixy" for short
|
|
//
|
|
// All Pixy source code is provided under the terms of the
|
|
// GNU General Public License v2 (http://www.gnu.org/licenses/gpl-2.0.html).
|
|
// Those wishing to use Pixy source code, software and/or
|
|
// technologies under different licensing terms should contact us at
|
|
// cmucam@cs.cmu.edu. Such licensing terms are available for
|
|
// all portions of the Pixy codebase presented here.
|
|
//
|
|
// end license header
|
|
//
|
|
#ifndef BLOBS_H
|
|
#define BLOBS_H
|
|
|
|
#include <stdint.h>
|
|
#include "blob.h"
|
|
#include "pixytypes.h"
|
|
#include "colorlut.h"
|
|
#include "qqueue.h"
|
|
|
|
#define MAX_BLOBS 100
|
|
#define MAX_BLOBS_PER_MODEL 20
|
|
#define MAX_MERGE_DIST 5
|
|
#define MIN_AREA 20
|
|
#define MIN_COLOR_CODE_AREA 10
|
|
#define MAX_CODED_DIST 6
|
|
#define MAX_COLOR_CODE_MODELS 5
|
|
|
|
#define BL_BEGIN_MARKER 0xaa55
|
|
#define BL_BEGIN_MARKER_CC 0xaa56
|
|
|
|
enum ColorCodeMode
|
|
{
|
|
DISABLED = 0,
|
|
ENABLED = 1,
|
|
CC_ONLY = 2,
|
|
MIXED = 3 // experimental
|
|
};
|
|
|
|
class Blobs
|
|
{
|
|
public:
|
|
Blobs(Qqueue *qq, uint8_t *lut);
|
|
~Blobs();
|
|
int blobify();
|
|
uint16_t getBlock(uint8_t *buf, uint32_t buflen);
|
|
uint16_t getCCBlock(uint8_t *buf, uint32_t buflen);
|
|
BlobA *getMaxBlob(uint16_t signature=0);
|
|
void getBlobs(BlobA **blobs, uint32_t *len, BlobB **ccBlobs, uint32_t *ccLen);
|
|
int setParams(uint16_t maxBlobs, uint16_t maxBlobsPerModel, uint32_t minArea, ColorCodeMode ccMode);
|
|
int runlengthAnalysis();
|
|
#ifndef PIXY
|
|
void getRunlengths(uint32_t **qvals, uint32_t *len);
|
|
#endif
|
|
|
|
ColorLUT m_clut;
|
|
Qqueue *m_qq;
|
|
|
|
private:
|
|
int handleSegment(uint8_t signature, uint16_t row, uint16_t startCol, uint16_t length);
|
|
void endFrame();
|
|
uint16_t combine(uint16_t *blobs, uint16_t numBlobs);
|
|
uint16_t combine2(uint16_t *blobs, uint16_t numBlobs);
|
|
uint16_t compress(uint16_t *blobs, uint16_t numBlobs);
|
|
|
|
bool closeby(BlobA *blob0, BlobA *blob1);
|
|
int16_t distance(BlobA *blob0, BlobA *blob1);
|
|
void sort(BlobA *blobs[], uint16_t len, BlobA *firstBlob, bool horiz);
|
|
int16_t angle(BlobA *blob0, BlobA *blob1);
|
|
int16_t distance(BlobA *blob0, BlobA *blob1, bool horiz);
|
|
void processCC();
|
|
void cleanup(BlobA *blobs[], int16_t *numBlobs);
|
|
void cleanup2(BlobA *blobs[], int16_t *numBlobs);
|
|
bool analyzeDistances(BlobA *blobs0[], int16_t numBlobs0, BlobA *blobs[], int16_t numBlobs, BlobA **blobA, BlobA **blobB);
|
|
void mergeClumps(uint16_t scount0, uint16_t scount1);
|
|
|
|
void printBlobs();
|
|
|
|
CBlobAssembler m_assembler[CL_NUM_SIGNATURES];
|
|
|
|
uint16_t *m_blobs;
|
|
uint16_t m_numBlobs;
|
|
|
|
BlobB *m_ccBlobs;
|
|
uint16_t m_numCCBlobs;
|
|
|
|
bool m_mutex;
|
|
uint16_t m_maxBlobs;
|
|
uint16_t m_maxBlobsPerModel;
|
|
|
|
uint16_t m_blobReadIndex;
|
|
uint16_t m_ccBlobReadIndex;
|
|
|
|
uint32_t m_minArea;
|
|
uint16_t m_mergeDist;
|
|
uint16_t m_maxCodedDist;
|
|
ColorCodeMode m_ccMode;
|
|
BlobA *m_maxBlob;
|
|
|
|
#ifndef PIXY
|
|
uint32_t m_numQvals;
|
|
uint32_t *m_qvals;
|
|
#endif
|
|
};
|
|
|
|
|
|
|
|
#endif // BLOBS_H
|