无法使用 opencv imshow 查看彩色图像

Posted

技术标签:

【中文标题】无法使用 opencv imshow 查看彩色图像【英文标题】:Not able to view color images using opencv imshow 【发布时间】:2017-02-08 15:54:52 【问题描述】:

我无法使用 python-opencv 界面查看来自 R200 realsense 相机的彩色图像。 当我运行这个脚本时,窗口是空白的。 当我注释掉'cv2.namedWindow("Image window", 1)'时,它显示的是第一张图片。

import roslib
import sys
import rospy
import cv2
from std_msgs.msg import String
from geometry_msgs.msg import Twist
from sensor_msgs.msg import Image
from rospy.numpy_msg import numpy_msg
#from rospy_tutorials.msg import Floats
from cv_bridge import CvBridge, CvBridgeError
import numpy as np
import math;
import cv2;
#import matplotlib.pyplot as plt;
import sys;
#import caffe;
import socket;
#from sklearn import datasets;
import subprocess;

import message_filters
from rospy.numpy_msg import numpy_msg
import time
#####################

import os.path


class image_converter:

# Initializing variables, publishers and subscribers
  def __init__(self):
    print 'show window'
    cv2.namedWindow("Image window", 1)

    self.bridge = CvBridge()

    self.image_sub = rospy.Subscriber("/camera/rgb/image_color", Image, self.callback)


  # The main callback that processes the color and depth data.      
  def callback(self,color):


    start = time.time()
    # acquiring color and depth data (from ROS-python tutorial)
    try:

      frame = self.bridge.imgmsg_to_cv2(color, "bgr8")
    except CvBridgeError, e:
      print e

    frame = np.array(frame, dtype=np.uint8)

    cv2.imshow("Image window", frame)
    print 'test'
    cv2.waitKey(0)


def main(args):
  ic = image_converter()
  rospy.init_node('image_converter', anonymous=True)
  try:
    rospy.spin()
  except KeyboardInterrupt:
    print "Shutting down"
  cv2.destroyAllWindows()

if __name__ == '__main__':
main(sys.argv)

【问题讨论】:

【参考方案1】:

您确定namedWindow 标志值吗?我看到您在那里使用 int,但在文档 here 中,您可以找到正确的标志,适用于 C++ 和 python。

我通常在 C++ 中使用 OpenCV,所以我没有测试过,但它应该是这样工作的:

cv2.namedWindow( "Display window", cv2.WINDOW_AUTOSIZE );

如果方便您的需要,您也可以定义这样的显示功能:

def show(image, name="Image"):
    '''
    Routine to display the image.
    '''
    cv2.namedWindow(name, cv2.WINDOW_NORMAL)
    cv2.imshow(name, image)
    cv2.waitKey(0)

函数很琐碎,但我没有自己编码,所以这是第二个代码sn-p的source。

【讨论】:

这些宏通常绑定到枚举类型。如果你打印 cv2.WINDOW_AUTOSIZE 它返回 1 如前所述,没有检查,我是建议检查它,感谢您的澄清! 好的,我明白了,@PriyaNarayanan:因为您没有按任何键,所以只显示了第一帧。 cv2.waitKey(x) 等待 x 秒并返回。如果在倒计时结束之前按下某个键,它会立即返回所按下键的值。 cv2.waitKey(0) 无限期地等待击键。回调中的 cv2.waitKey(0) 显然停止了您使用 spin() 启动的 ROS 主循环。我没有注意到你在使用 ROS。

以上是关于无法使用 opencv imshow 查看彩色图像的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV+python 彩色图像通道拆分与组合并判断size,shape函数的用法与区别

openCV—Python——载入显示和保存图像

opencv

使用numpy蒙版数组和imshow绘制分段彩色图像

带有 Python 3 的 opencv3,imshow() 不显示图像

2021-10-30 vscode+Xming+树莓派使用python-opencv的imshow()函数时显现图像为灰色问题