如果没有窗口,则 opencv cv::addText 异常

Posted

技术标签:

【中文标题】如果没有窗口,则 opencv cv::addText 异常【英文标题】:opencv cv::addText exception if no window 【发布时间】:2017-07-15 09:50:57 【问题描述】:

我正在使用 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 错误:空指针(NULL guiReceiver(请创建一个窗口))在 cvAddText,文件 /home/vitaly/Documents/opencv/opencv/modules/highgui/src/window_QT.cpp, 在抛出一个实例后调用第 114 行终止 'cv::异常'什么(): /home/vitaly/Documents/opencv/opencv/modules/highgui/src/window_QT.cpp:114: 错误:(-27)NULL guiReceiver(请创建一个窗口)在函数中 cvAddText

如果我添加它就会消失

namedWindow("test", WINDOW_AUTOSIZE);

在添加文本之前。

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

这是我的问题

    为什么需要窗口? 有解决办法吗? (不创建窗口)

【问题讨论】:

我想你应该试试putText 我试过了。 putText 质量很差。 【参考方案1】:

正如您在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。

【讨论】:

请注意QMetaObject::invokeMethod(guiMainThread, "putText", Qt::QueuedConnection, // queued connection Q_ARG(void*, (void*) img), Q_ARG(QString,QString::fromUtf8(text)), Q_ARG(QPoint, QPoint(org.x,org.y)), Q_ARG(void*,(void*) font)); 应该没有线程间问题,因此您可以删除if (!guiMainThread) 【参考方案2】:

puttext 应该可以正常工作。

如果您正在寻找更强大的 gui 格式化选项,您可以使用与 OpenCV 主循环融为一体的 CanvasCV 库。

这里有一个关于使用它的Text widget的教程。

这是另一个关于自动的centering text with layouts。

【讨论】:

以上是关于如果没有窗口,则 opencv cv::addText 异常的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV:自动将窗口大小调整为显示的图像

如何清除openCV中的窗口内容

用opencv显示图片编译通过没有生成图形窗口是为啥?

如果没有父窗口,则无法在 PyQt 中创建新窗口

在 OpenCV 的窗口中添加两个 Mat

opencv的Java开发环境配置(IntelliJ idea)