C++ 使用Qt Creator播放视频的GUI
我喜欢和Qt Creator一起玩视频。我使用上面的代码,但它不好。我得到以下错误: IplImageToQImage未在此范围内声明C++ 使用Qt Creator播放视频的GUI,c++,c,opencv,qt-creator,C++,C,Opencv,Qt Creator,我喜欢和Qt Creator一起玩视频。我使用上面的代码,但它不好。我得到以下错误: IplImageToQImage未在此范围内声明 有人知道我如何在同一个窗口中使用OpenCV和Qt Creator播放视频吗?嗯,这很有意义,因为IplImage2QImage()不是Qt或OpenCV的一部分 您可能看到此函数在Internet上的某个地方被使用,并被复制/粘贴到您的代码中 通过在谷歌上的简单搜索,我发现了以下功能: frame = cvQueryFrame(camera); while(
有人知道我如何在同一个窗口中使用OpenCV和Qt Creator播放视频吗?嗯,这很有意义,因为
IplImage2QImage()
不是Qt或OpenCV的一部分
您可能看到此函数在Internet上的某个地方被使用,并被复制/粘贴到您的代码中
通过在谷歌上的简单搜索,我发现了以下功能:
frame = cvQueryFrame(camera);
while(key!='q'){
cvNamedWindow( "main",CV_WINDOW_AUTOSIZE);
cvShowImage("main", frame);
if(frame!=NULL){
drawSquares( frame, findSquares4( frame, storage ) );
/* wait for key. Also the function cvWaitKey takes care of event processing */
key = cvWaitKey(33);
IplImage *img = cvCloneImage(frame);
if (img->origin){
cvFlip(img);
img->origin= 0;
}
QImage* qimg = IplImageToQImage(img)
// qimg = IplImage2QImage (img);
QLabel label;
ui->label->setPixmap(QPixmap::fromImage(qimg));
cvReleaseImage(&img);
在我的Linux机器上,我用以下代码编译了它:
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <QtGui>
#include <QImage>
static QImage IplImage2QImage(const IplImage *iplImage)
{
int height = iplImage->height;
int width = iplImage->width;
if (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 3)
{
const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
QImage img(qImageBuffer, width, height, QImage::Format_RGB888);
return img.rgbSwapped();
}
else if (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 1)
{
const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
QImage img(qImageBuffer, width, height, QImage::Format_Indexed8);
QVector<QRgb> colorTable;
for (int i = 0; i < 256; i++)
{
colorTable.push_back(qRgb(i, i, i));
}
img.setColorTable(colorTable);
return img;
}
else
{
std::cout << "Image cannot be converted.";
return QImage();
}
}
int main(int argc, char** argv)
{
QApplication app(argc, argv);
IplImage* img = cvLoadImage("test.jpg", 1);
if (!img)
{
std::cout << "Failed to load test.jpg";
return -1;
}
QImage qt_img = IplImage2QImage(img);
QLabel label;
label.setPixmap(QPixmap::fromImage(qt_img));
label.show();
return app.exec();
}
这个问题本身很糟糕,但即使如此,你能至少尝试格式化你的代码吗?你可以看到它现在的样子。可能是重复的,谢谢你的帮助,但我尝试使用此函数,但它不确定。它不确定不是对你面临的问题的准确描述。我用一个功能完整的最小示例更新了答案,只是为了向你展示我之前共享的代码有效!如果您能投票选出有用的答案,并选择解决您问题的答案,那就太好了。最后一部分,您可以通过单击答案附近的复选框来选择它作为您问题的正式答案。对不起,我尝试显示视频,而不仅仅是图像,因此如果您可以,请在播放视频后为我显示界面的打印屏幕?您问题中所述的问题已在我的答案中解决。正确的做法是,如果我的答案对您有所帮助,请对其进行投票,或者通过单击答案旁边的复选框将其作为您问题的正式答案,或者同时进行这两种操作!不要劫持自己的线程。我注意到你已经问了一个关于如何使用OpenCV和Qt播放视频的问题,我正在考虑帮助你,但你应该一次只做一件事。
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <QtGui>
#include <QImage>
static QImage IplImage2QImage(const IplImage *iplImage)
{
int height = iplImage->height;
int width = iplImage->width;
if (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 3)
{
const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
QImage img(qImageBuffer, width, height, QImage::Format_RGB888);
return img.rgbSwapped();
}
else if (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 1)
{
const uchar *qImageBuffer = (const uchar*)iplImage->imageData;
QImage img(qImageBuffer, width, height, QImage::Format_Indexed8);
QVector<QRgb> colorTable;
for (int i = 0; i < 256; i++)
{
colorTable.push_back(qRgb(i, i, i));
}
img.setColorTable(colorTable);
return img;
}
else
{
std::cout << "Image cannot be converted.";
return QImage();
}
}
int main(int argc, char** argv)
{
QApplication app(argc, argv);
IplImage* img = cvLoadImage("test.jpg", 1);
if (!img)
{
std::cout << "Failed to load test.jpg";
return -1;
}
QImage qt_img = IplImage2QImage(img);
QLabel label;
label.setPixmap(QPixmap::fromImage(qt_img));
label.show();
return app.exec();
}
g++ qimage.cpp -o qimage -I/usr/local/include/opencv -I/usr/local/include -I/opt/qt_47x/include -I/opt/qt_47x/include/QtGui -L/usr/local/lib -L/opt/qt_47x/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lQtCore -lQtGui