opencv cv::addText exception if no window



我正在使用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 错误:空指针(空) guiReceiver (请创建一个窗口)) 在 cvAddText, 文件/home/vitaly/Documents/opencv/opencv/modules/highgui/src/window_QT.cpp, 第 114 行终止在抛出 'cv::Exception' what():/home/vitaly/Documents/opencv/opencv/modules/highgui/src/window_QT.cpp:114: 错误: (-27) 空 gui接收器 (请创建一个窗口) 在函数中 cv添加文本

如果我添加,它会消失

namedWindow("test", WINDOW_AUTOSIZE);

在添加文本之前。

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

所以这是我的问题

  1. 为什么需要窗口?
  2. 有没有办法解决它?(不创建窗口)

正如你在源代码中看到的:

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。

puttext应该可以按照已经建议的那样正常工作。

如果您正在寻找更强大的 gui 格式选项,您可以使用 CanvasCV 库,该库融合到 OpenCV 主循环中。

这是有关使用其文本小部件的教程。

这是另一个关于使用布局自动居中文本的文章。

最新更新