You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
3.2 KiB
C

5 years ago
#ifndef _ED_
#define _ED_
#include <opencv2/opencv.hpp>
#include "EDColor.h"
/// Special defines
#define EDGE_VERTICAL 1
#define EDGE_HORIZONTAL 2
#define ANCHOR_PIXEL 254
#define EDGE_PIXEL 255
#define LEFT 1
#define RIGHT 2
#define UP 3
#define DOWN 4
enum GradientOperator { PREWITT_OPERATOR = 101, SOBEL_OPERATOR = 102, SCHARR_OPERATOR = 103, LSD_OPERATOR = 104 };
struct StackNode {//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>
int r, c; // <20><><EFBFBD>ص<EFBFBD>λ<EFBFBD><CEBB>
int parent; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int dir; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
struct Chain {//<2F><>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ڼ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ÿ<EFBFBD><C3BF>Chain<69>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ͬChain֮<6E><D6AE>ͨ<EFBFBD><CDA8>parent<6E><74>children<65><6E>ֵ<EFBFBD><D6B5><EFBFBD>в<EFBFBD><D0B2><EFBFBD>
int dir; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>
int len; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>ij<EFBFBD><C4B3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
int parent; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>˫<EFBFBD><CBAB>
int children[2]; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><C4BA>ӣ<EFBFBD>children[0]<5D><><EFBFBD><EFBFBD>left<66><74>up<75><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>children[1]<5D><><EFBFBD><EFBFBD>right<68><74>down<77><6E><EFBFBD><EFBFBD>
cv::Point *pixels; // <20><><EFBFBD>ɵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>׵<EFBFBD>ַ
};
class ED {
public:
ED(cv::Mat _srcImage, GradientOperator _op = PREWITT_OPERATOR, int _gradThresh = 20, int _anchorThresh = 0, int _scanInterval = 1, int _minPathLen = 10, double _sigma = 1.0, bool _sumFlag = true);
ED(const ED &cpyObj);
ED(short* gradImg, uchar *dirImg, int _width, int _height, int _gradThresh, int _anchorThresh, int _scanInterval = 1, int _minPathLen = 10, bool selectStableAnchors = true);
ED(EDColor &cpyObj);
ED();
cv::Mat getEdgeImage();
cv::Mat getAnchorImage();
cv::Mat getSmoothImage();
cv::Mat getGradImage();
int getSegmentNo();
int getAnchorNo();
std::vector<cv::Point> getAnchorPoints();
std::vector<std::vector<cv::Point>> getSegments();
std::vector<std::vector<cv::Point>> getSortedSegments();
cv::Mat drawParticularSegments(std::vector<int> list);
protected:
int width; // Դͼ<D4B4><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int height; // Դͼ<D4B4><CDBC><EFBFBD>߶<EFBFBD>
uchar *srcImg; //ָ<><D6B8>ԭͼ<D4AD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<std::vector< cv::Point> > segmentPoints;//<2F><>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿһ<C3BF>д<EFBFBD><D0B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Point
double sigma; //<2F><>˹<EFBFBD><CBB9><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD>ң<EFBFBD><D2A3><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ΧԽ<CEA7><D4BD>
cv::Mat smoothImage;
uchar *edgeImg; //ָ<><D6B8><EFBFBD>õ<EFBFBD><C3B5>ı<EFBFBD>Եͼ<D4B5><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uchar *smoothImg; //ָ<><D6B8><EFBFBD><EFBFBD>˹ƽ<CBB9><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int segmentNos;//<2F>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD>Ե
int minPathLen;//<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>̡<EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>ı<EFBFBD>Ե
cv::Mat srcImage;
private:
void ComputeGradient();
void ComputeAnchorPoints();
void JoinAnchorPointsUsingSortedAnchors();
void sortAnchorsByGradValue();
int* sortAnchorsByGradValue1();
static int LongestChain(Chain *chains, int root);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>Ե<EFBFBD><D4B5><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
static int RetrieveChainNos(Chain *chains, int root, int chainNos[]);
int anchorNos;//<2F>ҵ<EFBFBD><D2B5><EFBFBD>ê<EFBFBD><C3AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<cv::Point> anchorPoints;
std::vector<cv::Point> edgePoints;
cv::Mat edgeImage;//<2F><>Եͼ<D4B5><CDBC>
cv::Mat gradImage;//<2F>ݶ<EFBFBD>ͼ<EFBFBD>񣬵<EFBFBD><F1A3ACB5><EFBFBD>Gx+Gyʱ<79><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD>Ϳ<EFBFBD><CDBF>ܻ<EFBFBD><DCBB><EFBFBD><EFBFBD><EFBFBD>255<35><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>short<72>͡<EFBFBD>
uchar *dirImg; //ָ<><D6B8><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD>Ե·<D4B5><C2B7>׷<EFBFBD><D7B7>
short *gradImg; //ָ<><D6B8><EFBFBD>ݶ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GradientOperator op; //ö<><C3B6><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int gradThresh; //<2F>ݶ<EFBFBD><DDB6><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>
int anchorThresh; //ê<><C3AA><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ֵԽС<D4BD><D0A1><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>ê<EFBFBD><C3AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>
int scanInterval; //ɨ<><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>scanInterval<61>У<EFBFBD>scanInterval<61><6C>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>һ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>ڸ<EFBFBD>˹<EFBFBD>˵ijߴ
bool sumFlag;//=1ʱֱ<CAB1>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD>ӣ<EFBFBD>Ĭ<EFBFBD><C4AC>Ϊtrue<75><65><EFBFBD><EFBFBD>=0ʱ<30><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>͵Ŀ<CDB5><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
};
#endif