В QT Creator как мы можем загружать изображения с камеры. Я много гуглил, но не нашел правильного решения. Ниже приведен мой код.
mCamera = new QCamera;
mViewfinder = new QCameraViewfinder;
mLayout = new QVBoxLayout(ui->graphicsView);
mLayout->addWidget(mViewfinder);
mCamera->setViewfinder(mViewfinder);
mViewfinder->show();
mCamera->start();
Я попробовал QCamera::FrontFace и QCamera::BackFace в аргументе конструктора в QCamera, как показано ниже.
mCamera = new QCamera(QCamera::FrontFace);
и
mCamera = new QCamera(QCamera::BackFace );
Но оба не имеют никакой разницы. В Питоне
video=cv2.flip(self.frame,1)
решит проблему, Любая идея, как решить эту проблему. Я использую Windows 10
QCamera::FrontFace и QCamera::BackFace — это всего лишь позиции камеры. Чтобы достичь того, чего вы хотите, вы должны перевернуть каждое изображение.
Создайте QCameraImageCapture и подключитесь к его сигналу imageCaptured().
auto imageCapture = new QCameraImageCapture( mCamera );
connect(imageCapture, &QCameraImageCapture::imageCaptured, [&](int id, const QImage &preview){
QImage flipped = preview.mirrored();
// do what you want with flipped image
})
Документация говорит, что зеркально (bool horizontal = false, bool vertical = true)
Возвращает зеркало изображения, зеркально отраженное в горизонтальном и/или вертикальном направлении, в зависимости от того, установлены ли для горизонтального и вертикального значения true или false.
ОБНОВЛЯТЬ:
Я нашел камеру, протестировал код и понял, что забыл одну важную вещь. Вам нужно использовать таймер, по которому QCameraImageCapture будет захватывать изображение.
Создайте QTimer и подключитесь к сигналу QTimer::timeout()
:
connect (&timer, &QTimer::timeout, [&](){
camera->searchAndLock();
imageCapture->capture();
camera->unlock();
});
И после этого запустить таймер. Чтобы показать перевернутое изображение, вы можете использовать только класс QLabel с методом label->setPixmap(QPixmap::fromImage(flipped))
.
я изменил код в соответствии с вашим ответом, но в графическом элементе View View ничего не отображается. я отредактировал свой ответ и также добавил ваш код ..
Доступна ли камера mCamera? Проверьте его состояние после запуска. Также вы можете попробовать подключиться к сигналу errorOccurred(). К сожалению, сейчас у меня нет камеры для тестирования. Но я думаю, что проблема в инициализации QCamera. Попробуйте загрузить камеры с помощью QCameraInfo::availableCameras()
и использовать одну из них. Кроме того, попробуйте переместить mCamera->start()
в конец функции.
я использую свою веб-камеру на коленях, у нее нет проблем, до сих пор она работает и с моим старым кодом.
Я обновил ответ и протестировал найденную камеру.
Я обновил свой код с помощью виджета метки (videoFrame) и сделал, как вы сказали. Но не повезло, мой вопрос обновлен новым кодом. Это правильно?
Нет, вы должны запустить таймер после соединений. И если вы используете этот код как метод класса, я думаю, вам следует переместить определение imageCamera в определение класса и использовать его как поле класса, например mCamera, чтобы избавиться от утечки памяти.
спасибо за вашу помощь, и код у меня работает..... В "QImage flipped = preview.mirrored(true,false);" я добавил параметры "true" и "false", иначе изображение отображается перевернутым. .
Хай, я изменил свой код в соответствии с ответом @Allocse и его работой для меня. Мой полный код будет
mCamera = new QCamera;
mCamera->start();
imageCapture = new QCameraImageCapture( mCamera );
connect (&timer, &QTimer::timeout, [&](){
mCamera->searchAndLock();
imageCapture->capture();
mCamera->unlock();
});
connect(imageCapture, &QCameraImageCapture::imageCaptured, [&](int id, const QImage &preview){
QImage flipped = preview.mirrored(true,false);
ui->videoFrame->setPixmap(QPixmap::fromImage(flipped));
});
timer.start();
Примечание. -mCamera и imageCapture должны быть объявлены в декларации класса.
Вы также используете OpenCV?