Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Далі знаходиться фрагмент коду з описом функції drawAR: - (void) drawAR { Matrix44 projectionMatrix; [self buildProjectionMatrix:m_calibration.getIntrinsic():m_frameSize.width :m_frameSize.height :projectionMatrix]; glMatrixMode(GL_PROJECTION); glLoadMatrixf(projectionMatrix.data); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
Atronax
18.02.21 в 13:24
|
|
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glPushMatrix(); glLineWidth(3.0f); float lineX[] = {0,0,0,1,0,0}; float lineY[] = {0,0,0,0,1,0}; float lineZ[] = {0,0,0,0,0,1}; const GLfloat squareVertices[] = { -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, }; const GLubyte squareColors[] = { 255, 255, 0, 255, 0, 255, 255, 255, 0, 0, 0, 0, 255, 0, 255, 255, }; for (size_t transformationIndex=0; transformationIndex<m_transformations.size(); transformationIndex++) {
Atronax
18.02.21 в 13:25
|
|
const Transformation& transformation = m_transformations[transformationIndex]; Matrix44 glMatrix = transformation.getInverted().getMat44(); glLoadMatrixf(reinterpret_cast<const GLfloat*> (&glMatrix.data[0])); // малюємо дані glVertexPointer(2, GL_FLOAT, 0, squareVertices); glEnableClientState(GL_VERTEX_ARRAY); glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors); glEnableClientState(GL_COLOR_ARRAY); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableClientState(GL_COLOR_ARRAY); float scale = 0.5; glScalef(scale, scale, scale); glColor4f(1.0f, 0.0f, 0.0f, 1.0f); glVertexPointer(3, GL_FLOAT, 0, lineX); glDrawArrays(GL_LINES, 0, 2); glColor4f(0.0f, 1.0f, 0.0f, 1.0f); glVertexPointer(3, GL_FLOAT, 0, lineY); glDrawArrays(GL_LINES, 0, 2); glColor4f(0.0f, 0.0f, 1.0f, 1.0f); glVertexPointer(3, GL_FLOAT, 0, lineZ); glDrawArrays(GL_LINES, 0, 2); } glPopMatrix(); glDisableClientState(GL_VERTEX_ARRAY); } }
Atronax
18.02.21 в 13:26
|
|
Запустивши програму, ви отримаєте такий малюнок: Ми не використовуємо жодного двигуна 3D візуалізації для сцени, однак наявні всі необхідні дані, щоб зробити це власноруч. Тож ми отримали наступне: Кадр у форматі BGRA з пристрою камери Коректну матрицю проєкції, що дає вірні перспективні перетворення для візуалізації сцени доповненої реальності Список знайдених поз маркерів Ці дані легко використати у будь-якому 3D двигуні та створити власний застосунок з доповненою реальністю, заснованою на маркерах. Як можна бачити, чотирикутники з градієнтним заповненням та центральні точки розміщуються чітко на маркерах. Це ключова особливість AR - безшовне змішування реальних зображень та штучних об'єктів.
Atronax
18.02.21 в 13:46
|
|
|
|
|
У цьому розділі ми навчилися створювати мобільні застосунки доповненої реальності для пристроїв iPhone/iPad, здобули знання про те, як використовувати бібліотеку OpenCV у проєктах XCode, щоб створювати дивовижні застосунки-шедеври. Використання OpenCV дозволяє програмам здійснювати складну обробку зображень на мобільних пристроях з прийнятною продуктивністю.
Atronax
18.02.21 в 13:55
|
|
Також ми дізнались, як здійснювати первинну обробку зображень (перетворення у відтінки сірого та бінаризацію), як знаходити закриті контури та апроксимувати їх до полігонів, як виокремлювати маркери та декодувати їх, як обчислювати позицію маркера в просторі та візуалізувати 3D об'єкти доповненої реальності.
Atronax
18.02.21 в 13:57
|
|
Посилання ArUco: найменша бібліотека для застосунків доповненої реальності на базі OpenCV (http://www.uco.es/investiga/grupos/ava/node/26) OpenCV Camera Calibration and 3D Reconstruction (http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html) OpenCV: Estimating Projective Relations in Images (http://www.packtpub.com/article/opencvestimatingprojective-relations-images) Multiple View Geometry in Computer Vision (second edition), R.I. Hartley and A. Zisserman, Cambridge University Press, ISBN 0-521-54051-8
Atronax
18.02.21 в 14:11
|
|