我试图从相机捕捉实时视图,并重定向它以显示在QLabel上。 但只有一半的观点出现(见下文):
左侧窗口使用cv :: imshow()显示,效果很好。 我在另一个线程中捕获Mat,然后以Qimage作为参数发出信号,然后将图像设置为插槽中的QLabel。
这里是代码:
while(true){
cam >> mat;
cv::imshow("name",mat);
emit send_UIupdate(mat2qimage(mat));
}
并在插槽中将图像设置为Qlabel:
void Dialog::updateUI(const QImage &img){
label->setPixmap(QPixmap::fromImage(img));
}
使用以下内容将Mat转换为QImage:
QImage camera::mat2qimage(const cv::Mat& mat) {
cv::Mat rgb;
cv::cvtColor(mat, rgb, CV_BGR2RGB);
return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888);
}
有任何建议,解决这个问题吗?
答案 0 :(得分:8)
你可以试试这个:
QImage MainWindow::putImage(const Mat& mat)
{
// 8-bits unsigned, NO. OF CHANNELS=1
if(mat.type()==CV_8UC1)
{
// Set the color table (used to translate colour indexes to qRgb values)
QVector<QRgb> colorTable;
for (int i=0; i<256; i++)
colorTable.push_back(qRgb(i,i,i));
// Copy input Mat
const uchar *qImageBuffer = (const uchar*)mat.data;
// Create QImage with same dimensions as input Mat
QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8);
img.setColorTable(colorTable);
return img;
}
// 8-bits unsigned, NO. OF CHANNELS=3
if(mat.type()==CV_8UC3)
{
// Copy input Mat
const uchar *qImageBuffer = (const uchar*)mat.data;
// Create QImage with same dimensions as input Mat
QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
return img.rgbSwapped();
}
else
{
qDebug() << "ERROR: Mat could not be converted to QImage.";
return QImage();
}
}
我用QTimer称呼它。我是从那里得到的:http://code.google.com/p/qt-opencv-multithreaded/
希望得到这个帮助。
答案 1 :(得分:0)
我认为问题来自以下代码:
while(true){
cam >> mat;
cv::imshow("name",mat);
emit send_UIupdate(mat2qimage(mat));
}
您的应用程序冻结是因为您正在循环并且从不让Qt进行必要的处理。 ref-link:QT do while loop
你知道,Qt有它的地雷事件循环,所以,如果你在一个函数中使用while(true)循环,Qt可能永远不会收到该事件。
尝试删除while循环,并使用Qtimer作为@CTZStef说。
以下源代码可能对您有所帮助: http://blog.csdn.net/robertkun/article/details/9030929
答案 2 :(得分:0)
在mat2qimage函数中,你应该返回一个副本。
return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, Image::Format_RGB888).copy();
答案 3 :(得分:0)
VideoCapture cap("video.avi");
Mat frame;
QImage img;
QPixmap pixel;
while(cap.isOpened())
{
cap >> frame;
img= QImage((uchar*) frame.data, frame.cols, frame.rows, frame2.step, QImage::Format_RGB888);
pixel = QPixmap::fromImage(img);
ui->label->setPixmap(pixel);
}