ofxCv
ofxCv copied to clipboard
HSV Tracker doesn't wrap correctly
this means reddish colors may not be tracked correctly. the fix would look something like this:
float minS = clamp(sTarget-20, 0, 255);
float maxS = clamp(sTarget+20, 0, 255);
float minV = 0;
float maxV = 255;
cv::Scalar minRange = cv::Scalar(hTarget - hWidth, minS, minV);
cv::Scalar maxRange = cv::Scalar(hTarget + hWidth, maxS, maxV);
if(minRange[0] < 0)
{
//negative side
cv::inRange(hsvImg, cv::Scalar(180+minRange[0], minS, minV) , cv::Scalar(180, maxS, maxV), minMap);
//positive side
cv::inRange(hsvImg, cv::Scalar(0, minS, minV), maxRange, maxMap);
cv::bitwise_or(minMap,maxMap, threshedMap);
//NSLog(@"less than");
}
else if(maxRange[0] > 180)
{
//neg side
cv::inRange(hsvImg, minRange, cv::Scalar(180, maxS, maxV), minMap);
//pos side
cv::inRange(hsvImg, cv::Scalar(0, minS, minV), cv::Scalar(180 - maxRange[0], maxS, maxV), maxMap);
cv::bitwise_or(minMap,maxMap, threshedMap);
//NSLog(@"more than");
}
else
{
cv::inRange(hsvImg, minRange, maxRange, threshedMap);
//NSLog(@"in range.");
}