Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2023, 06:28   #1
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию C++/OpenCV/OpenGL

Всем доброго времени суток!
В C++ я не шибко силён, поставил себе задачу, но никак не могу разобраться в чём я не прав.
Решил сделать AR проект. Шлем почти готов, а вот с ПО проблемы...
Суть такая: хочу отобразить трёхмерный куб в видеопотоке с веб-камеры, некое такое AR приложение.
Я научился отображать видео с веб-камеры в окно OpenCV.
Код:
Код:
//OpenCV
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>

//OpenCV_CUDA
#include <opencv2/dnn.hpp>
#include <opencv2/core/cuda.hpp>

//Windows
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <fstream>

using namespace std;
using namespace cv;

int main()
{
    namedWindow("OpenGL");
    
    // Создаем объект VideoCapture для чтения с веб-камеры
    VideoCapture cap(0);
    
    while (cv::waitKey(1) != 27)
    {
        // Читаем кадр с веб-камеры
        Mat frame;

        cap.read(frame);
        // Отображаем кадр с веб-камеры в окне
        imshow("OpenGL", frame);
    }

    return 0;
}
Так же я научился рисовать куб на OpenGL в окне OpenCV.
Код:
Код:
//OpenCV
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>

//OpenCV_CUDA
#include <opencv2/dnn.hpp>
#include <opencv2/core/cuda.hpp>

//Windows
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <fstream>

//OpenGL
#pragma comment(lib, "opengl32")
#pragma comment(lib, "glu32")
#include <gl/GL.h>
#include <gl/GLU.h>

using namespace std;
using namespace cv;
//using namespace dnn;
//using namespace cuda;

void draw_cube(void*)
{
    // Draw blue cube
    glColor3f(0.0f, 0.0f, 1.0f);
    glBegin(GL_QUADS);
    // Front face
    glVertex3f(-0.5f, -0.5f, 0.5f);  // Bottom-left of the face
    glVertex3f(0.5f, -0.5f, 0.5f);  // Bottom-right of the face
    glVertex3f(0.5f, 0.5f, 0.5f);  // Top-right of the face
    glVertex3f(-0.5f, 0.5f, 0.5f);  // Top-left of the face
    // Back face
    glVertex3f(-0.5f, -0.5f, -0.5f);  // Bottom-right of the face
    glVertex3f(-0.5f, 0.5f, -0.5f);  // Top-right of the face
    glVertex3f(0.5f, 0.5f, -0.5f);  // Top-left of the face
    glVertex3f(0.5f, -0.5f, -0.5f);  // Bottom-left of the face
    // Top face
    glVertex3f(-0.5f, 0.5f, -0.5f);  // Top-left of the face
    glVertex3f(-0.5f, 0.5f, 0.5f);  // Bottom-left of the face
    glVertex3f(0.5f, 0.5f, 0.5f);  // Bottom-right of the face
    glVertex3f(0.5f, 0.5f, -0.5f);  // Top-right of the face
    // Bottom face
    glVertex3f(-0.5f, -0.5f, -0.5f);  // Top-right of the face
    glVertex3f(0.5f, -0.5f, -0.5f);  // Top-left of the face
    glVertex3f(0.5f, -0.5f, 0.5f);  // Bottom-left of the face
    glVertex3f(-0.5f, -0.5f, 0.5f);  // Bottom-right of the face
    // Right face
    glVertex3f(0.5f, -0.5f, -0.5f);  // Bottom-right of the face
    glVertex3f(0.5f, 0.5f, -0.5f);  // Top-right of the face
    glVertex3f(0.5f, 0.5f, 0.5f);  // Top-left of the face
    glVertex3f(0.5f, -0.5f, 0.5f);  // Bottom-left of the face
    // Left face
    glVertex3f(-0.5f, -0.5f, -0.5f);  // Bottom-left of the face
    glVertex3f(-0.5f, -0.5f, 0.5f);  // Bottom-right of the face
    glVertex3f(-0.5f, 0.5f, 0.5f);  // Top-right of the face
    glVertex3f(-0.5f, 0.5f, -0.5f);  // Top-left of the face
    glEnd();
}

int main()
{
    // Create an OpenCV window
    namedWindow("OpenGL", WINDOW_OPENGL);
    resizeWindow("OpenGL", 640, 480);
    setOpenGlContext("OpenGL");
    
    // Clear the window with white color
    //glClearColor(1.0f, 1.0f, 1.0f, 0.0f);   //белый фон окна

    for(;;)
    {
        // Set the view mode
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        //gluLookAt(0, 0, 1, 0, 0, 0, 0, 1, 0);

        gluPerspective(60.0, 640.0 / 480.0, 0.1, 100.0);

        // Draw the cube
        glTranslatef(0.0f, 0.0f, -5.0f);
        
        glRotatef(30.0f, 0.0f, 1.0f, 0.0f);

        // Clear the color and depth buffer
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        
        updateWindow("OpenGL");

        //не знаю как этот блок подключить в правильную работу
        //cap.read(frame);
        // Отображаем кадр с веб-камеры в окне
        //imshow("OpenGL", frame);
        //не знаю как этот блок подключить в правильную работу

        setOpenGlDrawCallback("OpenGL", draw_cube);

        // Wait for a key event to close the window
        if (waitKey(1) == 27) 
            break;
    }

    return 0;
}
В итоге у меня рисуется просто куб на чёрном фоне. И индикация на веб-камере тоже горит, значит, она активная.
Есть у кого какие идеи? Буду рад любой подсказке!
Изображения
Тип файла: png cube.png (5.6 Кб, 0 просмотров)
Это вам не это
25-й кадр вне форума Ответить с цитированием
Старый 15.03.2023, 07:42   #2
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию

Товарищи, значит-ся, изображение с веб-камеры я смогу запихнуть в окно OpenGL.
Код:
//OpenCV
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>

//OpenCV_CUDA
#include <opencv2/dnn.hpp>
#include <opencv2/core/cuda.hpp>

//Windows
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <fstream>

//OpenGL
#pragma comment(lib, "opengl32")
#pragma comment(lib, "glu32")
#include <gl/GL.h>
#include <gl/GLU.h>

using namespace std;
using namespace cv;
//using namespace dnn;
//using namespace cuda;

Mat img;

unsigned int texture;

void init_hz(Mat img)
{
    flip(img, img, 0);

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.cols, img.rows,
                                    0, GL_BGR_EXT, GL_UNSIGNED_BYTE, img.data);
    glBindTexture(GL_TEXTURE_2D, 0);
}

float vertex[] = { -1,-1,0, 1,-1,0, 1,1,0, -1,1,0 };
float texCoord[] = { 0,0, 1,0, 1,1, 0,1 };

void hz_show(void*)
{
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);

    glColor3f(1,1,1);
    glPushMatrix();
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);

        glVertexPointer(3, GL_FLOAT, 0, vertex);
        glTexCoordPointer(2, GL_FLOAT, 0, texCoord);
        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glPopMatrix();
}

Mat frame;
VideoCapture cap;
int main()
{
    cap.open(0);
    cap >> frame;
    
    // Create an OpenCV window
    namedWindow("OpenGL", WINDOW_OPENGL);
    resizeWindow("OpenGL", 640, 480);
    //setOpenGlContext("OpenGL");

    // Clear the window with white color
    //glClearColor(1.0f, 1.0f, 1.0f, 0.0f);

    for (;;)
    {
        cap.read(frame);
        init_hz(frame);

        updateWindow("OpenGL");
        setOpenGlDrawCallback("OpenGL", hz_show);

        // Wait for a key event to close the window
        if (waitKey(1) == 27)
            break;
    }

    return 0;
}
Осталось добавить куб и уже получится что-то похожее на AR на минималках.

P.S.: если видите, что у меня лишние строки или можно написать что-то поизысканнее, пишите!
Это вам не это

Последний раз редактировалось 25-й кадр; 15.03.2023 в 07:43. Причина: Дописать.
25-й кадр вне форума Ответить с цитированием
Старый 15.03.2023, 08:28   #3
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию

А вот и с вращающимся кубом. Вдруг, кому пригодится.
Код:
//OpenCV
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>

//OpenCV_CUDA
#include <opencv2/dnn.hpp>
#include <opencv2/core/cuda.hpp>

//Windows
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <fstream>

//OpenGL
#pragma comment(lib, "opengl32")
#pragma comment(lib, "glu32")
#include <gl/GL.h>
#include <gl/GLU.h>

using namespace std;
using namespace cv;
//using namespace dnn;
//using namespace cuda;

void draw_cube(float angle)
{
    //glClear(GL_COLOR_BUFFER_BIT);
    
    gluPerspective(60.0, 640.0 / 480.0, 0.1, 100.0);
    glTranslatef(0.0f, 0.0f, -5.0f);

    glRotatef(30.0f + angle, 0.0f, 1.0f, 0.0f);
    // Draw blue cube
    glColor3f(0.0f, 0.0f, 1.0f);
    glBegin(GL_QUADS);
        // Front face
        glVertex3f(-0.5f, -0.5f, 0.5f);  // Bottom-left of the face
        glVertex3f(0.5f, -0.5f, 0.5f);  // Bottom-right of the face
        glVertex3f(0.5f, 0.5f, 0.5f);  // Top-right of the face
        glVertex3f(-0.5f, 0.5f, 0.5f);  // Top-left of the face
        // Back face
        glVertex3f(-0.5f, -0.5f, -0.5f);  // Bottom-right of the face
        glVertex3f(-0.5f, 0.5f, -0.5f);  // Top-right of the face
        glVertex3f(0.5f, 0.5f, -0.5f);  // Top-left of the face
        glVertex3f(0.5f, -0.5f, -0.5f);  // Bottom-left of the face
        // Top face
        glVertex3f(-0.5f, 0.5f, -0.5f);  // Top-left of the face
        glVertex3f(-0.5f, 0.5f, 0.5f);  // Bottom-left of the face
        glVertex3f(0.5f, 0.5f, 0.5f);  // Bottom-right of the face
        glVertex3f(0.5f, 0.5f, -0.5f);  // Top-right of the face
        // Bottom face
        glVertex3f(-0.5f, -0.5f, -0.5f);  // Top-right of the face
        glVertex3f(0.5f, -0.5f, -0.5f);  // Top-left of the face
        glVertex3f(0.5f, -0.5f, 0.5f);  // Bottom-left of the face
        glVertex3f(-0.5f, -0.5f, 0.5f);  // Bottom-right of the face
        // Right face
        glVertex3f(0.5f, -0.5f, -0.5f);  // Bottom-right of the face
        glVertex3f(0.5f, 0.5f, -0.5f);  // Top-right of the face
        glVertex3f(0.5f, 0.5f, 0.5f);  // Top-left of the face
        glVertex3f(0.5f, -0.5f, 0.5f);  // Bottom-left of the face
        // Left face
        glVertex3f(-0.5f, -0.5f, -0.5f);  // Bottom-left of the face
        glVertex3f(-0.5f, -0.5f, 0.5f);  // Bottom-right of the face
        glVertex3f(-0.5f, 0.5f, 0.5f);  // Top-right of the face
        glVertex3f(-0.5f, 0.5f, -0.5f);  // Top-left of the face
    glEnd();

    // Flush the OpenGL commands
    glFlush();
}

Mat img;

unsigned int texture;

void init_hz(Mat img)
{
    flip(img, img, 0);


    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.cols, img.rows,
                                    0, GL_BGR_EXT, GL_UNSIGNED_BYTE, img.data);
    glBindTexture(GL_TEXTURE_2D, 0);
}

float vertex[] = { -1,-1,0, 1,-1,0, 1,1,0, -1,1,0 };
float texCoord[] = { 0,0, 1,0, 1,1, 0,1 };

int angle = 0;

void hz_show(void*)
{
    
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);

    glColor3f(1,1,1);
    glPushMatrix();
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);

        glVertexPointer(3, GL_FLOAT, 0, vertex);
        glTexCoordPointer(2, GL_FLOAT, 0, texCoord);
        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);

        draw_cube(angle);
    glPopMatrix();
}

Mat frame;
VideoCapture cap;
int main()
{
    cap.open(0);
    //cap >> frame;
    
    // Create an OpenCV window
    namedWindow("OpenGL", WINDOW_OPENGL);
    resizeWindow("OpenGL", 640, 480);
    //setOpenGlContext("OpenGL");

    // Clear the window with white color
    //glClearColor(1.0f, 1.0f, 1.0f, 0.0f);

    for (;;)
    {
        cap.read(frame);
        init_hz(frame);

        updateWindow("OpenGL");
        setOpenGlDrawCallback("OpenGL", hz_show);
        angle +=3.0f;
        // Wait for a key event to close the window
        if (waitKey(1) == 27)
            break;
    }

    return 0;
}
Это вам не это
25-й кадр вне форума Ответить с цитированием
Старый 28.08.2023, 04:40   #4
daiman
Новичок
Джуниор
 
Регистрация: 28.08.2023
Сообщений: 3
По умолчанию

Привет, подскажи пожалуйста, как ты настраивал opencv для совместной работы c opengl?

у меня в namedWindow("OpenGL", WINDOW_OPENGL); флаг "WINDOW_OPENGL" выдаёт необработанное исключение. ставлю другой флаг типа "WINDOW_NORMAL" ошибки на етой строке нет.
daiman вне форума Ответить с цитированием
Старый 28.08.2023, 08:17   #5
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию

daiman, привет. Нужно конфигурировать OpenCV с поддержкой OpenGL через CMake.
Вот есть видео, как настраивают с поддержкой CUDA: https://vk.com/video63642361_4562396...d5b7445a7bbc3a.
Если CUDA не надо, то через CMake находишь галочку WITH OPENGL, ну и собираешь.
Изображения
Тип файла: jpg zxcasdqwe.jpg (18.4 Кб, 2 просмотров)
Это вам не это
25-й кадр вне форума Ответить с цитированием
Старый 28.08.2023, 20:46   #6
daiman
Новичок
Джуниор
 
Регистрация: 28.08.2023
Сообщений: 3
По умолчанию

25-й кадр, спасбо большое

видео к сожалению с ограниченным доступом, но я поищу альтернативу, главное есть направление куда думать )

Последний раз редактировалось daiman; 28.08.2023 в 20:48.
daiman вне форума Ответить с цитированием
Старый 29.08.2023, 09:22   #7
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию

daiman, не увидел, что ссылка на вк прицепилась.
Пардон, ошибка с видео.
Вот видео по установке opencv в MSVS:
https://www.youtube.com/watch?v=WnRA...NicolaiNielsen
А тут видео по сборке OpenCV через CMake.
https://www.youtube.com/watch?v=-GY2...NicolaiNielsen
Это вам не это

Последний раз редактировалось 25-й кадр; 29.08.2023 в 09:25.
25-й кадр вне форума Ответить с цитированием
Старый 29.08.2023, 15:30   #8
daiman
Новичок
Джуниор
 
Регистрация: 28.08.2023
Сообщений: 3
По умолчанию

спасибо ещё раз
daiman вне форума Ответить с цитированием
Старый 30.08.2023, 03:48   #9
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию

daiman, если что-то будет не получаться, пиши, попробуем разобраться.)
Это вам не это
25-й кадр вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenCV Taner Visual C++ 1 17.05.2014 18:01
OpenCV Zed32 Visual C++ 1 12.10.2011 19:37
OpenCV Редиска_Саша Помощь студентам 1 10.10.2011 22:52
Opencv scripto Общие вопросы C/C++ 0 17.02.2011 18:53
OpenCV marselik Общие вопросы C/C++ 0 23.04.2010 15:35