-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPatternMatching.h
65 lines (58 loc) · 2.65 KB
/
PatternMatching.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#pragma once
#include <iostream>
#include <opencv2/opencv.hpp>
#include "CudaSupporter.cuh"
#include "AlignerConsts.h"
class PatternMatcher
{
private:
struct GpuPtr
{
uchar* devSceneData;
uchar* devMoment1stData;
uchar* devBinaryMapData;
float* devObjectMoment;
uchar* devOriginalSceneData;
int* devStatsData;
uint* devCircleSumVecHost;
float* devRMat;
float* devOutR;
ushort* devOutX;
ushort* devOutY;
};
struct ObjectInfo
{
ushort objectLen, radius, offset;
float objectMoment[NUM_MOMOENTS];
std::vector<uint> circleSumVecHost;
bool isObjectLenEven;
};
GpuPtr gpuPtr;
ObjectInfo objectInfo;
cv::Mat scene;
int SumCircleHost(cv::Mat& image, const ushort centerX, const ushort centerY, const ushort radius);
void SetObjectROI(const cv::Mat& originalObject, const cv::Mat& object, ushort& objectLength, ushort& originalObjectLen, cv::Mat& objectROI);
void SetSceneROI(const cv::Mat& scene, const ushort& objectLen, ushort& offset, cv::Rect& sceneROI, bool& isObjectLenEven);
void GetObjectMoment(const cv::Mat& objectROI, float* objectMoment);
void GpuFree(const GpuPtr& gpuPtr);
void GpuMalloc(const GpuPtr& gpuPtr, const uint originalScenePixels = NUM_STANDARD_ORIGINAL_SCENE_PIXELS, const uint scenePixels = NUM_MALLOCED_SCENE_PIXELS
, const ushort radius = LEN_MALLOCED_RADIUS, const uint numCandidates = NUM_MALLOCED_CANDIDATES);
void GpuUpload(const GpuPtr& gpuPtr, const cv::Mat& scene, const uint scenePixels, const cv::Mat& binaryMap
, const float* objectMoment, const cv::Mat& originalScene, const uint originalScenePixels, std::vector<uint>& circleSumVecHost, const ushort radius
, const std::vector<float>& outR, const std::vector<ushort>& outX, const std::vector<ushort>& outY, const uint numCandidates);
void GetAdaptiveBinaryMap(const cv::Mat& scene, const ushort offset, const bool isObjectLenEven, const GpuPtr& gpuPtr, const ushort objectLen
, const cv::Mat& binaryMap);
void GpuUploadStats(const cv::Mat& binaryMap, const ushort objectLen, const GpuPtr& gpuPtr, uint& statsLen, uint& sizeFilter1Passed);
void GetRMap(const uint sizeFilter1Passed, const ushort radius, const GpuPtr& gpuPtr, const cv::Mat& originalScene, const uint statsLen
, const ushort objectLen, const cv::Mat& scene);
void SortRXY(const cv::Mat& originalScene, const GpuPtr& gpuPtr, std::vector<float>& outR, std::vector<ushort>& outX, std::vector<ushort>& outY
, const uint numCandidates, uint& maxRIdx);
public:
cv::Mat originalObject;
cv::Mat object;
cv::Mat originalScene;
PatternMatcher();
~PatternMatcher();
cv::Point FindRXY(const cv::Rect& sceneROI);
void SetObjectInfo();
};