Similarity
This commit is contained in:
1 parent
601730e0ce
commit
15febc4651
5 files changed
+39
-114
No files matched your search
@@ -148,7 +148,7 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;TARGET_WIN32;_WIN32_WINNT=0x0501;WIN32_LEAN_AND_MEAN;EIGEN_DONT_ALIGN_STATICALLY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
|
||||
@@ -1,18 +1,13 @@
|
||||
#include "FaceLandmarkDetector.h"
|
||||
|
||||
|
||||
|
||||
static const size_t faceTrackerWidth = 300;
|
||||
static const size_t faceTrackerHeight = 300;
|
||||
|
||||
static const double faceTrackerScaleFactor = 1.0;
|
||||
static const cv::Scalar faceTrackerMeanVal(104.0, 177.0, 123.0);
|
||||
|
||||
|
||||
float calcSquaredDistanceBetweenFaces(const cv::Rect& face1, const cv::Rect& face2)
|
||||
{
|
||||
|
||||
|
||||
cv::Point2f oldCenter(face1.x + face1.width*0.5f, face1.y + face1.height*0.5f);
|
||||
cv::Point2f newCenter(face2.x + face2.width*0.5f, face2.y + face2.height*0.5f);
|
||||
|
||||
@@ -24,8 +19,14 @@ float calcSquaredDistanceBetweenFaces(const cv::Rect& face1, const cv::Rect& fac
|
||||
return squareDistance;
|
||||
}
|
||||
|
||||
|
||||
|
||||
double calcSimilarity(const cv::Mat& first, const cv::Mat& second)
|
||||
{
|
||||
// assumes that first and second have the same size
|
||||
double errorL2 = cv::norm(first, second, CV_L2);
|
||||
// Convert to a reasonable scale, since L2 error is summed across all pixels of the image.
|
||||
double similarity = errorL2 / static_cast<double>(first.rows * first.cols);
|
||||
return similarity;
|
||||
}
|
||||
|
||||
FaceLandmarkDetector::FaceLandmarkDetector()
|
||||
{
|
||||
@@ -45,18 +46,13 @@ FaceLandmarkDetector::FaceLandmarkDetector()
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
faceNet = cv::dnn::readNetFromCaffe(faceTrackerConfiguration, faceTrackerBinary);
|
||||
|
||||
for (size_t i = 0; i < MAX_FACE_COUNT; i++)
|
||||
{
|
||||
landmarkNetArr[i] = cv::dnn::readNetFromCaffe(landmarkTrackerConfiguration, landmarkTrackerBinary);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
FaceLandmarkDetector::~FaceLandmarkDetector()
|
||||
{
|
||||
StopTrackProcess();
|
||||
@@ -161,7 +157,6 @@ void FaceLandmarkDetector::FindFaceThreadProc()
|
||||
if (!localFrame.empty())
|
||||
{
|
||||
std::vector<cv::Rect> faces = InnerFindFaces(localFrame);
|
||||
|
||||
std::vector<cv::Mat> faceFrames;
|
||||
|
||||
//Get rid of faces that are too big
|
||||
@@ -186,14 +181,13 @@ void FaceLandmarkDetector::FindFaceThreadProc()
|
||||
InnerSeparateFacesToBuckets(faces, faceFrames, localFaceRectArr);
|
||||
|
||||
|
||||
for (size_t i = 0; i <localFaceRectArr.size(); i++)
|
||||
for (size_t i = 0; i < localFaceRectArr.size(); i++)
|
||||
{
|
||||
if (localFaceRectArr[i].valid)
|
||||
{
|
||||
localFaceRectArr[i].frameIndex = localFrameIndex;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -214,19 +208,15 @@ void FaceLandmarkDetector::FindFaceThreadProc()
|
||||
localFrameIndex = syncLastFrameIndex;
|
||||
|
||||
localStop = syncStop;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void FaceLandmarkDetector::FindLandmarkThreadProc(size_t threadIndex)
|
||||
{
|
||||
|
||||
FaceIntermediateStruct localInputFace;
|
||||
|
||||
FaceLandmarkStruct localOutputLandmarks;
|
||||
|
||||
bool localStop = false;
|
||||
|
||||
while (!localStop)
|
||||
{
|
||||
if (localInputFace.valid)
|
||||
@@ -258,6 +248,7 @@ void FaceLandmarkDetector::FindLandmarkThreadProc(size_t threadIndex)
|
||||
|
||||
localOutputLandmarks.faceRect = localInputFace.faceRect;
|
||||
localOutputLandmarks.frameIndex = localInputFace.frameIndex;
|
||||
localOutputLandmarks.similarity = localInputFace.similarity;
|
||||
localOutputLandmarks.valid = true;
|
||||
}
|
||||
else
|
||||
@@ -268,17 +259,11 @@ void FaceLandmarkDetector::FindLandmarkThreadProc(size_t threadIndex)
|
||||
|
||||
|
||||
//Sync area
|
||||
|
||||
std::unique_lock<std::mutex> lock(syncMutex);
|
||||
|
||||
// OUT to main thread >>>>
|
||||
syncFaceLandmarkArr[threadIndex] = localOutputLandmarks;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
bool doLoop = true;
|
||||
|
||||
while (doLoop)
|
||||
@@ -315,7 +300,6 @@ void FaceLandmarkDetector::FindLandmarkThreadProc(size_t threadIndex)
|
||||
}
|
||||
|
||||
|
||||
|
||||
std::vector<cv::Rect> FaceLandmarkDetector::InnerFindFaces(cv::Mat frame)
|
||||
{
|
||||
if (frame.channels() == 4)
|
||||
@@ -356,8 +340,6 @@ std::vector<cv::Rect> FaceLandmarkDetector::InnerFindFaces(cv::Mat frame)
|
||||
object.width = object.width*1.2f;
|
||||
object.height = object.height*1.2f;
|
||||
|
||||
|
||||
|
||||
faces.push_back(object);
|
||||
}
|
||||
}
|
||||
@@ -468,6 +450,7 @@ void FaceLandmarkDetector::InnerSeparateFacesToBuckets(std::vector<cv::Rect>& fa
|
||||
}
|
||||
}
|
||||
|
||||
inOutBucketArr[j].similarity = calcSimilarity(inOutBucketArr[j].faceFrame, facesBelongsToSpace[j][lastIndex].second);
|
||||
inOutBucketArr[j].faceRect = facesBelongsToSpace[j][lastIndex].first;
|
||||
inOutBucketArr[j].faceFrame = facesBelongsToSpace[j][lastIndex].second;
|
||||
|
||||
|
||||
@@ -16,23 +16,17 @@
|
||||
#include <opencv2/dnn.hpp>
|
||||
|
||||
#include <thread>
|
||||
|
||||
|
||||
#include <queue>
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
|
||||
|
||||
#define USE_3D_LANDMARKS
|
||||
|
||||
|
||||
//#include "boost/thread.hpp"
|
||||
|
||||
constexpr size_t LANDMARK_POINT_COUNT = 68;
|
||||
|
||||
constexpr size_t MAX_FACE_COUNT = 5;
|
||||
|
||||
|
||||
struct FaceIntermediateStruct
|
||||
{
|
||||
bool valid = false;
|
||||
@@ -41,7 +35,7 @@ struct FaceIntermediateStruct
|
||||
cv::Mat faceFrame;
|
||||
|
||||
int frameIndex;
|
||||
|
||||
double similarity = 0.0;
|
||||
};
|
||||
|
||||
|
||||
@@ -53,6 +47,7 @@ struct FaceLandmarkStruct
|
||||
std::array<cv::Point2f, LANDMARK_POINT_COUNT> landmarkArr;
|
||||
|
||||
int frameIndex;
|
||||
double similarity = 0.0;
|
||||
};
|
||||
|
||||
|
||||
@@ -105,7 +100,4 @@ protected:
|
||||
cv::Mat InnerCutFaceFrame(cv::Mat frame, cv::Rect faceRect);
|
||||
|
||||
void InnerSeparateFacesToBuckets(std::vector<cv::Rect>& faceArr, std::vector<cv::Mat>& faceFrameArr, std::array<FaceIntermediateStruct, MAX_FACE_COUNT>& inOutBucketArr);
|
||||
|
||||
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user