簡體   English   中英

OpenCV 2.4.7與Qt 4.8.1 QImage沖突

[英]OpenCV 2.4.7 conflict with Qt 4.8.1 QImage

Ubuntu 12.04,Qt 4.8,OpenCv 2.4.3,PCL 1.6 通過Qt Creator 2.5.2進行全部開發。 全部為64位版本。

直到現在我都沒有遇到這個問題,因為我通過“ cv :: imread(filename)”處理磁盤中的圖像文件,然后將其數據傳輸到QImage-> QPixmap-> QLabel。 沒問題。

現在,我需要將一些圖像加載到Qt資源文件中。 我通過Qt Creator創建了正確的.qrc,並在其中復制和注冊了圖像文件。 好吧,如果我嘗試從資源中加載圖像,它將無法正常工作:

QImage qi = QImage(":images/red.jpg");
if (qi.isNull())
{
QMessageBox::warning(this,"hey","hey");
}

當然,一開始我一整天都在努力尋找資源名稱。 直到我決定開始其他項目,並復制粘貼了資源文件和加載該QImage的代碼。 在測試項目中,它工作正常。 (同一台計算機,相同的IDE和環境,但沒有OpenCV鏈接)。 看到這一點,我決定嘗試這段代碼:

QString fn = QFileDialog::getOpenFileName(this,"Load image");
qi = QImage(fn);
if (qi.isNull())
{
QMessageBox::warning(this,"hey","hey");
}

在原始代碼中,這不起作用! fn已加載正確的文件名,但“ qi = QImage(fn);” 失敗。 在測試程序中,這按預期工作。

這是一個大問題,因為我想在窗口中設置一些圖標,並為幾個小部件和QSplashScreen設置一些圖像。 假設用戶不對其進行任何操作,將圖像文件復制到生成的二進制文件文件夾並加載它們不是很可接受。

我必須再次指出,這不是Qt資源文件名的問題。

有一些解決方法或想法嗎?

PD:我嘗試過QPixmap(“:images / red.jpg”); 但是程序執行失敗。

PD:一些項目設置:

ResFiles.qrc:

<RCC>
<qresource prefix="/">
<file>images/red.png</file>
</qresource>
</RCC>

QOP.proj文件:

#-------------------------------------------------
#
# Project created by QtCreator 2013-03-09T23:56:16
#
#-------------------------------------------------

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = QOP
TEMPLATE = app

SOURCES += main.cpp\
mainwindow.cpp \
[several files more...]

HEADERS += mainwindow.h \
[several files more...]

FORMS += mainwindow.ui \
camwindow.ui \
dialogsetupcam.ui \
dialogtestcam_sr4k.ui \
dialogtestcam_pmdnano.ui \
dialogcommand_pmdnano.ui \
dialogcreatecam.ui

CONFIG += link_pkgconfig
PKGCONFIG += opencv

CONFIG += link_pkgconfig
PKGCONFIG +=

#Do not use this configuration to get PCL, some sublibraries aren't properly accesible, in example Visualizer
#CONFIG += link_pkgconfig
#PKGCONFIG += pcl_io-1.6

#PCL Headers
INCLUDEPATH += /usr/include/pcl-1.6\
/usr/include/flann/\
/usr/include/eigen3/\
/usr/include/openni/
#PCL Libraries
LIBS += -lpcl_common\
-lpcl_features\
-lpcl_filters\
-lpcl_geometry\
-lpcl_io\
-lpcl_kdtree\
-lpcl_keypoints\
-lpcl_octree\
-lpcl_registration\
-lpcl_sample_consensus\
-lpcl_search\
-lpcl_segmentation\
-lpcl_surface\
-lpcl_tracking\
-lpcl_visualization

#VTK Headers
INCLUDEPATH += /usr/include/vtk-5.8
#VTK Libraries
LIBS += -lQVTK\
-lvtkalglib\
-lvtkCharts\
-lvtkCommon\
-lvtkDICOMParser\
-lvtkexoIIc\
-lvtkFiltering\
-lvtkftgl\
-lvtkGenericFiltering\
-lvtkGeovis\
-lvtkGraphics\
-lvtkHybrid\
-lvtkImaging\
-lvtkInfovis\
-lvtkIO\
-lvtkmetaio\
-lvtkParallel\
-lvtkproj4\
-lvtkQtChart\
-lvtkRendering\
-lvtksys\
-lvtkverdict\
-lvtkViews\
-lvtkVolumeRendering\
-lvtkWidgets

RESOURCES += \
ResFiles.qrc

OTHER_FILES += \
images/red.png

我想到的一種解決方法是使用某些QFile類加載這些圖像並將其“傳輸”到QImage。 能做到嗎?

我已經通過以下方式解決了這個問題:

//This WON'T WORK due to problems caused by presence of OpenCV library; it interferes with normal QImage loading from QResources
/*
QImage logoImage(":/images/Logo.png");
*/
//Read file rawly into RAM (workaround to OpenCV/QImage issue)
bool isImageInRAM = false;
QFile       file(":/images/Logo.png"); //Apparently there's no difference between ":/images/QOPLogo.png" and ":images/Logo.png"
QByteArray  rawImageFileInRAM;
if (file.open(QIODevice::ReadOnly))
{
    rawImageFileInRAM = file.readAll();
    file.close();
    isImageInRAM = true;
}
else
    checkFailed(0,QObject::tr("Error loading image from resource: %1").arg(QObject::tr("Logo"))); //checkFailed is a custom method that shows message errors

//This WON'T WORK due to problems caused by presence of OpenCV library; it interferes with normal QImage loading from memory (yes, too U_U)
/*
QImage logoImage = QImage::fromData(rawImageFileInRAM);
*/
std::vector<uchar> buffInRAM(rawImageFileInRAM.data(),rawImageFileInRAM.data()+rawImageFileInRAM.size());
cv::Mat imgMatFromRAM = cv::imdecode(cv::Mat(buffInRAM),CV_LOAD_IMAGE_COLOR);
cv::Mat cvRGBLogoImage(imgMatFromRAM.rows,imgMatFromRAM.cols,CV_8UC3);
cv::cvtColor(imgMatFromRAM,cvRGBLogoImage,CV_BGR2RGB); //Convert BGR->RGB
QImage logoImage((const unsigned char*)cvRGBLogoImage.data,cvRGBLogoImage.cols,cvRGBLogoImage.rows,cvRGBLogoImage.step,QImage::Format_RGB888);

//At this point logoImage already has image from resources ¡Yeaahhhh!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM