Russian Qt Forum
Ноябрь 23, 2024, 22:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как занести видео поток (OpenCV) в виджет?  (Прочитано 6986 раз)
kemosab
Гость
« : Октябрь 16, 2017, 14:39 »

Понадобилось в срочном порядке допилить интерфейс для программы, суть ее в том, что она распознает изображения с веб камеры, но это не так важно.
В опред. момент мы открываем вебку:

C++ (Qt)
Цитировать
VideoCapture cap(0);

как я понял из комментариев другого разработчика (моя часть только интерфейс) именно это открывает отдельное окно с видео потоком с вебки. Так вот вопрос, как мне встроить это видео в окно проекта Qt.

Очень много гуглил, но так как с QT работаю впервые, а времени пару дней, (и уже потрачено пару на поиски реализации) решил попросить Вашей помощи. На найденных мною ответах (не совсем совпадало) либо не получалось, либо я мог понять что сделать, в виду языкового барьера и отсутствия соответствующих знаний (только начал работать с ООП в принципе).

Если нужны какие-то исходники- без проблем.
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #1 : Октябрь 16, 2017, 14:54 »

1) Да поправят меня более опытные товарищи, но cv::VideoCapture (если в цитате именно о нем речь) просто класс для захвата изображения (не суть с какого источника), никаких окон не создается и т.д., там же вручную надо кадры выдирать через read.
2) Если Вы занимаетесь только интерфейсной частью, то логичнее выглядит вариант, когда Вам кидают сигнал с готовым кадром в нужном Вам формате, и Вы отрисовываете его в нужном Вам месте/виде. Хотите на QLabel, или что-то более специфичное.
Записан
kemosab
Гость
« Ответ #2 : Октябрь 16, 2017, 14:58 »

1) Да поправят меня более опытные товарищи, но cv::VideoCapture (если в цитате именно о нем речь) просто класс для захвата изображения (не суть с какого источника), никаких окон не создается и т.д., там же вручную надо кадры выдирать через read.
2) Если Вы занимаетесь только интерфейсной частью, то логичнее выглядит вариант, когда Вам кидают сигнал с готовым кадром в нужном Вам формате, и Вы отрисовываете его в нужном Вам месте/виде. Хотите на QLabel, или что-то более специфичное.

Код
C++ (Qt)
int Camera()
{
   int c;
   VideoCapture cap(0); // opens default webcam
 
   /*/if (!cap.isOpened())
   {
       break;
   }*/

 
   Mat frame;
   vector<vector<Point> > squares;
   for (;;)
   {
       cap >> frame;
       if (frame.empty())
       {
           break;
       }
       findSquares(frame, squares);
       drawSquares(frame, squares);
       imshow("Detection", frame);
       c = waitKey(33);
       if (c == 27)
           return 0;
   }
}

Собственно, вот код. Возможно мне что-то не так объяснили, но по логике тогда во frame хранится каждый кадр, верно?

Для меня никто уже ничего не поменяет, так сказать Подмигивающий Нужно самому разобраться
« Последнее редактирование: Октябрь 16, 2017, 15:00 от kemosab » Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #3 : Октябрь 16, 2017, 15:16 »

Да, во frames к моменту imshow (вот тут то и идет показ в собственное окно) содержится нужный Вам кадр. Только с форматами наверное придется чутка помудрить.
Записан
kemosab
Гость
« Ответ #4 : Октябрь 16, 2017, 15:36 »

Да, во frames к моменту imshow (вот тут то и идет показ в собственное окно) содержится нужный Вам кадр. Только с форматами наверное придется чутка помудрить.
а что вы конкретно имеете в виду? Чтобы поместить frame в QLabel нужно будет помучиться?

И еще вопрос, который по ходу возник. При нажатии на кнопку, нужно поменять цвета у 50+ объектов. Каждый объект соответствует записи в массиве (например frame000, если в массиве хранится 0(цвет) и 00 (номер frame), то нужно сделать frame000 белым).
Как менять цвет программно я нагуглил и разобрался.
Код
C++ (Qt)
ui->frame000->setStyleSheet("QPushButton{background-color: blue;}");
Но так и не понял, как сделать в цикле, например вот так:
Код
C++ (Qt)
for (int i = 0; i < 56; i++) {
/*допустим в color у нас хранится цвет*/
ui->frame0[i]->setStyleSheet("QFrame{background-color:" [b]color [/b]";}");
}
Как то так, думаю мысль понятна.
« Последнее редактирование: Октябрь 16, 2017, 15:38 от kemosab » Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #5 : Октябрь 16, 2017, 15:54 »

а что вы конкретно имеете в виду? Чтобы поместить frame в QLabel нужно будет помучиться?
Есть подозрения, что там кадр в BGR хранится.

Насчет цвета, если я правильно понял, можно использовать QColor::name

Код
C++ (Qt)
QColor Color = Qt::white;
QString ColorName = Color.name();
for (int i = 0; i < 56; i++) {
ui->frame0[i]->setStyleSheet("QFrame{background-color:"  + ColorName + ";}");
}
 
Записан
kemosab
Гость
« Ответ #6 : Октябрь 16, 2017, 16:01 »

Код:
[quote author=Apktyc link=topic=31674.msg234171#msg234171 date=1508158451]
Насчет цвета, если я правильно понял, можно использовать [url=http://doc.qt.io/qt-5/qcolor.html#name]QColor::name[/url]

[code=cpp]QColor Color = Qt::white;
QString ColorName = Color.name();
for (int i = 0; i < 56; i++) {
ui->frame0[i]->setStyleSheet("QFrame{background-color:"  + ColorName + ";}");
}
[/quote]

Да, именно то что хотел (чуть позже будет ясно, но ход мыслей ясен)
А что на счет нумерации frame? Я не могу заменять часть их имени переменной-счетчиком. У меня там будет 3 цикла, то есть
Код
C++ (Qt)
   for (int i = 0; i < 6; i++) {
        for (int j = 0; j < 3; j++) {
             for (int k = 0; k < 3; k++) {
             ui->frame->setStyleSheet("QFrame{background-color:"  + ColorName + ";}");
             }
        }
   }
     [/code]
« Последнее редактирование: Октябрь 16, 2017, 16:13 от kemosab » Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #7 : Октябрь 16, 2017, 16:30 »

Поместите указатели на свои фреймы в контейнер какой-нибудь, и оттуда по индексам (i, j, k) обновляйте.
Записан
kemosab
Гость
« Ответ #8 : Октябрь 16, 2017, 16:34 »

Поместите указатели на свои фреймы в контейнер какой-нибудь, и оттуда по индексам (i, j, k) обновляйте.
контейнер имеется в виду что-то вроде vector или stl? Еще не сталкивался с этим. Или имеется в виду combobox какой нибудь?

Раз указатели, то очевидно, что первое. Я создаю виджеты в режиме дизайнера, это критично? Просто если программно создавать объекты, я еще чуть представляю как это поместить туда, а вот если через дизайнера то понятия не имею.
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #9 : Октябрь 16, 2017, 16:47 »

Как-то так findChildren
Записан
kemosab
Гость
« Ответ #10 : Октябрь 16, 2017, 17:17 »

Как-то так findChildren

почитал, спасибо
Но я наверное что-то не так делаю, если писать так, то выбирает еще и QTextEdit
Код
C++ (Qt)
QList<QFrame *> allQFrame = this->findChildren<QFrame *>();
Решил добавить маску по имени, что то вроде
Код
C++ (Qt)
QList<QFrame *> allQFrame = this->findChildren<QFrame *>("frame***");
Но так не выбирает ничего
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #11 : Октябрь 17, 2017, 10:04 »

У findChildren есть вариант с регулярным выражением, так-то.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.192 секунд. Запросов: 23.