Я использую OpenCV вместе с OpenNI, чтобы извлечь руку, а затем отдельные пальцы из изображения глубины, сгенерированного датчиком Xtion. Когда был выполнен жест фокуса для генератора рук, hasHand bool устанавливается в true и запускается приведенный ниже код. Рука [] — это массив чисел с координатами x, y и z отслеживаемой руки.
if(hasHand)
{
unsigned char shade = 255 - (unsigned char)(hand[2] * 128.0f);
Scalar color(0, shade, 0);
vector<Point> handContour;
getHandContour(depthMat, hand, handContour);
bool grasp = convexity(handContour) > grabConvexity; //PROBLEM
int thickness = grasp ? CV_FILLED : 3;
circle(depthMatBgr, Point(hand[0], hand[1]), 10, color, thickness);
vector<Point> fingerTips;
detectFingerTips(handContour, fingerTips, &depthMatBgr);
}
Все работает нормально до строки, которую я прокомментировал, и в этот момент я получаю:
OpenCV Error: Bad argument (input array is not a valid matrix) in unknown function, ...
Я застрял с этой проблемой некоторое время, и я понятия не имею, почему я получаю это. Код для getHandContour:
bool getHandContour(const Mat &depthMat, const float *v, vector<Point> &handContour)
{
const int maxHandRadius = 128; // in px
const short handDepthRange = 200; // in mm
const double epsilon = 17.5; // approximation accuracy (maximum distance between the original hand contour and its approximation)
depth = v[2] * 1000.0f; // hand depth
nearClip = depth - 100; // near clipping plane
farClip = depth + 100; // far clipping plane
static Mat mask(frameSize, CV_8UC1);
mask.setTo(0);
// extract hand region
circle(mask, Point(v[0], v[1]), maxHandRadius, 255, CV_FILLED);
mask = mask & depthMat > nearClip & depthMat < farClip;
// DEBUG(show mask)
imshow("mask1", mask);
// assume largest contour in hand region to be the hand contour
vector<vector<Point> > contours;
findContours(mask, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
int n = contours.size();
int maxI = -1;
int maxSize = -1;
for (int i=0; i<n; i++) {
int size = contours[i].size();
if (size > maxSize) {
maxSize = size;
maxI = i;
}
}
bool handContourFound = (maxI >= 0);
if (handContourFound) {
approxPolyDP( Mat(contours[maxI]), handContour, epsilon, true );
}
return maxI >= 0;
}
Я не уверен, достаточно ли информации для людей, чтобы помочь мне (вроде как плохо знакомых с этим), но любые толчки в правильном направлении будут высоко оценены.
РЕДАКТИРОВАТЬ: Извините, я забыл включить код выпуклости () в этот вопрос:
double convexity(const vector<Point> &contour) {
Mat contourMat(contour);
vector<int> hull;
convexHull(contourMat, hull);
int n = hull.size();
vector<Point> hullContour;
for (int i=0; i<n; i++) {
hullContour.push_back(contour[hull[i]]);
}
Mat hullContourMat(hullContour);
return (contourArea(contourMat) / contourArea(hullContourMat));
}
Я полагаю, что приблизительноPolyDP занимает только один счет, в то время как вы пытаетесь передать ему весь список
Других решений пока нет …