我正在尝试使用openCV在QT中做一个简单的相机应用程序,但黑框问题。
关键是,当我使用USB摄像头在桌面上运行我的应用程序时,一切似乎都正常运行,我正在获取帧,并且一切都在QGraphicsView中显示。
当我在带有嵌入式摄像头的笔记本电脑中运行我的应用程序时,问题开始了。当我的应用程序运行时,在QGraphicsView上我只能看到黑框。
这是我的代码示例:
首先是我的自定义QGraphicsView:
class CustomGraphicsView : public QGraphicsView
{
Q_OBJECT
public:
CustomGraphicsView(QWidget *parent);
~CustomGraphicsView();
void mouseMoveEvent(QMouseEvent *event);
QGraphicsPixmapItem *pItem;
QGraphicsScene *pScene;
QThread *p_worker;
QTimer *p_timer;
CustomThread *p_MyCustomThread;
public slots:
void StartThread();
void GetFrame(QPixmap);
};
CustomGraphicsView::CustomGraphicsView(QWidget *parent): QGraphicsView(parent)
{
pScene = new QGraphicsScene(this);
setScene(pScene);
pItem = new QGraphicsPixmapItem();
pItem->setPixmap(pixmap);
pScene->addItem(pItem);
}
void CustomGraphicsView::StartThread()
{
p_worker = new QThread();
p_MyCustomThread = new CustomThread();
p_MyCustomThread->moveToThread(p_worker);
connect(p_worker, SIGNAL(started()), p_MyCustomThread,SLOT(StartCamera()));
connect(p_MyCustomThread, SIGNAL(SendImage(QPixmap)), this, SLOT(GetFrame(QPixmap)));
p_worker->start();
}
void CustomGraphicsView::GetFrame(QPixmap pix)
{
pItem->setPixmap(pix);
pScene->update();
}
这是我的班级,可以接收来自摄像机的帧,将其转换为QPixmap并使用SIGNAL / SLOT发送到QGraphicsView。
class CustomThread : public QObject
{
Q_OBJECT
public:
CustomThread();
VideoCapture cam;
Mat frame;
void RunTaking();
public slots:
void StartCamera();
signals:
void SendImage(QPixmap);
};
void CustomThread::RunTaking()
{
while(1)
{
cam >> frame;
cvtColor(frame, frame, CV_BGR2RGB);
QImage image = QImage((uchar*) frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);
QPixmap pix = QPixmap::fromImage(image);
emit SendImage(pix);
}
}
void CustomThread::StartCamera()
{
if(cam.open(0))
{
RunTaking();
}
}
我试图对标签做同样的事情,没有自定义类,但是没有任何效果。
也许我做错了什么?如果有人知道解决方案,我将不胜感激。
在此先感谢您的回答!