2017-07-15 37 views
0

我使用OpenCV 3.2.0編譯Qt支持和功能cv::addText將文字放在圖像上。下面是重現錯誤opencv cv :: addText如果無窗口例外

#include <opencv/cv.hpp> 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 
    if (argc != 2) 
    { 
     cout << " Usage: display_image ImageToLoadAndDisplay" << endl; 
     return -1; 
    } 
    Mat image, resized; 
    image = imread(argv[1], IMREAD_COLOR); // Read the file 
    namedWindow("test", 1); 
    addText(image, "SomeText", Point(5, 27), fontQt("Times")); 
    namedWindow("Display window", WINDOW_AUTOSIZE); // Create a window for display. 
    imshow("Display window", image); // Show our image inside it. 
    waitKey(0); // Wait for a keystroke in the window 
    return 0; 
} 

我收到以下錯誤

/home/vitaly/CLionProjects/opencvTest/cmake-build-debug/opencvTest /home/vitaly/Pictures/img.jpg OpenCV Error: Null pointer (NULL guiReceiver (please create a window)) in cvAddText, file /home/vitaly/Documents/opencv/opencv/modules/highgui/src/window_QT.cpp, line 114 terminate called after throwing an instance of 'cv::Exception' what(): /home/vitaly/Documents/opencv/opencv/modules/highgui/src/window_QT.cpp:114: error: (-27) NULL guiReceiver (please create a window) in function cvAddText

它消失,如果我addText前加

namedWindow("test", WINDOW_AUTOSIZE); 

最簡單的代碼。

但是,我不明白爲什麼QT或OpenCV需要打開一個窗口?我不需要顯示圖像,我只是使用它來放置圖像上的文本,然後保存它,我不想創建任何窗口。

因此,這裏是我的問題

  1. 爲什麼是必需的窗口?
  2. 有沒有辦法解決它? (不創建窗口)
+0

我想你應該試試[putText](http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html#puttext) – ZdaR

+0

我試過了。 'putText'的質量很差。 –

回答

2

正如你可以在source code看到:

CV_IMPL void cvAddText(const CvArr* img, const char* text, CvPoint org, CvFont* font) 
{ 
    if (!guiMainThread) 
     CV_Error(CV_StsNullPtr, "NULL guiReceiver (please create a window)"); 

    QMetaObject::invokeMethod(guiMainThread, 
     "putText", 
     autoBlockingConnection(), 
     Q_ARG(void*, (void*) img), 
     Q_ARG(QString,QString::fromUtf8(text)), 
     Q_ARG(QPoint, QPoint(org.x,org.y)), 
     Q_ARG(void*,(void*) font)); 
} 

addText需要一個GUI線程。因爲實際繪圖發生在該線程中。沒有線程,沒有功能,沒有繪圖...

這是爲什麼?那麼因爲這對我猜測的某個人有意義。

它是開源的,可以自行編寫您自己的解決方法。否則使用OpenCV的putText。

+1

記住,應該沒有線程間問題'QMetaObject :: invokeMethod中(guiMainThread, 「putText」, 的Qt :: QueuedConnection,//排隊連接 Q_ARG(void *的,(無效*)IMG), Q_ARG(QString的,QString :: fromUtf8(text)), Q_ARG(QPoint,QPoint(org.x,org.y)), Q_ARG(void *,(void *)font));'所以你可以移除if(! guiMainThread){}' – AlexanderVX

0

puttext應該按照已經建議的那樣正常工作。

如果您正在尋找更強大的gui格式化選項,您可以使用混合到OpenCV主循環中的CanvasCV庫。

這裏是關於使用其Text widget的教程。

這是另一個關於自動centering text with layouts