c++ - 如果没有窗口,opencv cv::addText 异常

标签 c++ qt opencv image-processing

我使用 OpenCV 3.2.0 编译,支持 Qt 和函数 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

如果我添加它就会消失

namedWindow("test", WINDOW_AUTOSIZE);

在addText之前。

但是,我不明白为什么 qt 或 opencv 需要一个打开的窗口?我不需要显示图像,我只是用它来将文本放在图像上然后保存它,我不想创建任何窗口。

这是我的问题

  1. 为什么需要窗口?
  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。

关于c++ - 如果没有窗口,opencv cv::addText 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45116828/

相关文章:

c++ - 在 C++ 中作为参数传递给函数时,const string & str 和 string const & str 有什么区别

c++ - 如何在变量中传递方法名称?

c++ - 上下文无关的 C++ TCP 服务器类

c++ - 将 Eigen 对象作为参数传递时的指针与引用差异

c++ - 转到 http : no such file after sending image from Qt client

c++ - .exe 文件在 QtCreator 中构建后停止并最终启动?

c++ - 用于桌面 Gui 应用程序的 Qt 4.x/5.x 和 OpenGL : What module to choose?

c++ - 在 bash 中捕获线程转储

c++ - 错误 : ‘calcOpticalFlowPyrLK’ is not a member of ‘cv’ - OpenCV 2. 4.2

c - 示例 OpenCV 神经网络代码