void drawEllipseToData(ImgRGB& img, double x, double y, double var[4], uchar r, uchar g, uchar b) { double evec[4], eval[2]; dgeevFor(2, var, evec, eval); // int l1 = static_cast<int> (eval[0] + 0.5); // int l2 = static_cast<int> (eval[1] + 0.5); double l1 = sqrt(eval[0]); double l2 = sqrt(eval[1]); double dx1 = l1 * evec[0]; double dy1 = l1 * evec[1]; double dx2 = l2 * evec[2]; double dy2 = l2 * evec[3]; cv::Mat cvOutImg(img.rows, img.cols, CV_8UC3, img.data); cv::line(cvOutImg, cv::Point2f(x - dx1, y - dy1), cv::Point2f(x + dx1, y + dy1), cv::Scalar(r, g, b), 1, CV_AA); cv::line(cvOutImg, cv::Point2f(x - dx2, y - dy2), cv::Point2f(x + dx2, y + dy2), cv::Scalar(r, g, b), 1, CV_AA); //get rotation angle double theta = atan2(evec[0], evec[1]); cv::ellipse(cvOutImg, cv::Point2f(x, y), cv::Size(l1, l2), theta, 0, 360, cv::Scalar(r, g, b), 1, CV_AA); // double ivar[4]; // mat22Inv(var,ivar); }
void drawCurMapPoint(const MapPoint* p, double range, double pointSize, bool drawCov) { //GLfloat LightAmbient[] = { 0.5f, 1.0f, 0.5f, 1.0f }; GLfloat LightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f }; GLfloat LightAmbientInAct[] = { 0.5f, 0.5f, 0.5f, 1.0f }; GLfloat LightDiffuse[] = { 0.5f, 0.5f, 0.5f, 1.0f }; GLfloat LightPosition[] = { -range * 1.0f, -range * 1.0f, 0.0f, 1.0f }; glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbientInAct); glLightfv(GL_POSITION, GL_DIFFUSE, LightAmbientInAct); if( p->isFalse()) return; glColor3f(0.2f, 0.8f, 0.2f); //for debug if (p->flag == FLAG_MAPPOINT_TEST4) glColor3f(1.0f, 0.0f, 0.0f); // glEnable(GL_LIGHTING); // glEnable(GL_LIGHT1); // // glPushMatrix(); // glTranslatef(p->x, p->y, p->z); // glutSolidSphere(0.1 * range * p->numVisCam, 12, 12); // glPopMatrix(); // // glDisable(GL_LIGHT1); // glDisable(GL_LIGHTING); if(p->isFalse()) return; glPointSize(4.0 * pointSize); glBegin(GL_POINTS); glVertex3d(p->x, p->y, p->z); glEnd(); if (drawCov && p->cov[0] > 0) { glColor4f(0.2f, 0.8f, 0.2f, 0.2f); // //for debug // if (p->flag == FLAG_MAPPOINT_TEST4 // ) // glColor3f(1.0f, 0.0f, 0.0f); double evec[9]; double eval[3]; dgeevFor(3, p->cov, evec, eval); glPushMatrix(); glTranslatef(p->x, p->y, p->z); double rotMat[16]; memset(rotMat, 0, sizeof(double) * 16); memcpy(rotMat, evec, sizeof(double) * 3); memcpy(rotMat + 4, evec + 3, sizeof(double) * 3); memcpy(rotMat + 8, evec + 3, sizeof(double) * 3); rotMat[15] = 1; glMultMatrixd(rotMat); //assert(eval[0] > 0 && eval[1] > 0 && eval[2] > 0); glScaled(sqrt(eval[0]), sqrt(eval[1]), sqrt(eval[2])); glutSolidSphere(1.0, 12, 12); glPopMatrix(); } }