Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV destroyWindow()无法使用多个窗口_C++_Opencv - Fatal编程技术网

C++ OpenCV destroyWindow()无法使用多个窗口

C++ OpenCV destroyWindow()无法使用多个窗口,c++,opencv,C++,Opencv,我正在使用openCV库打开和显示多个图像。为了显示每个图像,我创建了多个窗口。为了同时显示多个窗口,我仅在最后一张图像之后使用waitKey() cv::namedWindow("Window1"); cv::imshow("Window1", myImage1); cv::namedWindow("Window2"); cv::imshow("Window2", myImage2); cv::waitKey(1

我正在使用openCV库打开和显示多个图像。为了显示每个图像,我创建了多个窗口。为了同时显示多个窗口,我仅在最后一张图像之后使用waitKey()

cv::namedWindow("Window1");
cv::imshow("Window1", myImage1);

cv::namedWindow("Window2");
cv::imshow("Window2", myImage2);
cv::waitKey(1000);
从代码中可以看出,我的目标是给用户1s的时间按下任何键,否则我想破坏其中一个窗口(就本问题而言,它可以是任意一个)。我想通过使用openCV的函数destronWindow()来实现这一点

下面是我的全部代码:

cv::namedWindow("Window1");
cv::imshow("Window1", myImage1);

cv::namedWindow("Window2");
cv::imshow("Window2", myImage2);
cv::waitKey(1000);

cv::destroyWindow("Window2");
此代码段的目标应该是,在用户不按任何键的情况下,如果经过1s,则只显示“Window1”。 然而,这并没有发生。最终结果是没有一个窗口被破坏

我已经测试了以下代码段,这导致两个窗口都被关闭:

cv::namedWindow("Window1");
cv::imshow("Window1", myImage1);

cv::namedWindow("Window2");
cv::imshow("Window2", myImage2);
cv::waitKey(1000);

cv::destroyWindow("Window1");
cv::destroyWindow("Window2");
当我使用destroyAllWindows()函数时也会得到同样的结果(这很有意义)

我现在的问题是,为什么我不能只销毁一个窗口?

其他信息:

  • 使用Ubuntu 20.04
  • OpenCV版本是4.2
  • 在C工作++
  • 更改要销毁的窗口的顺序不会改变任何内容

    • 试图复制它,在Python和Ubuntu中都面临着这个问题。如果您仍然被卡住,您可以尝试一种权宜之计,通过将
      waitKey
      的结果存储在某个变量中,仅重新显示您想要显示的内容,前提是用户是否按下了某个键。如果为-1,则未按下任何键

      我在Python提供了一个示例解决方案,不应该遇到转换为C++的任何困难。

      import cv2
      
      img1 = cv2.imread('img1.png')
      img2 = cv2.imread('img2.png')
      
      cv2.namedWindow('img1')
      cv2.imshow('img1', img1)
      
      cv2.namedWindow('img2')
      cv2.imshow('img2', img2)
      
      key = cv2.waitKey(5000)
      if key == -1:
          cv2.destroyAllWindows()
          cv2.imshow('img1', img1)
          cv2.waitKey(0)
      
      else:
          # do whatever destroy both or keep on showing both using cv2.waitKey(0)
      
      cv2.destroyAllWindows()
      

      我通过在添加每个窗口之前添加
      startWindowThread()
      找到了一个解决方案。 需要注意的一点是,我已经使用GTK选项构建了openCV,所以我的解决方案只在GTK上测试,而不是在其他平台上测试


      startWindowThread()
      仅与GTK一起使用,如下所述:-对于其他函数,函数为空。

      这是在循环中吗?while循环还是for循环?