구독자가 게시자의 이미지를 읽을 수 없습니다.

JustAn00b

opencv와 pyqt5를 통합하여 구독자가 GUI로 이미지를 표시하도록 시도했지만 버튼을 클릭하면 이미지가 표시되지 않습니다. pyqt5를 구독자에 통합하기 전에 opencv 자체만으로 이미지를 표시 할 수있었습니다.

-Ubuntu 18.04를 사용하고 있습니다.

내 게시자 코드 :

def main():
image_pub = rospy.Publisher("/image", Image, queue_size=1)
rate = rospy.Rate(50)
bridge = CvBridge()

while not rospy.is_shutdown():
      print("------------Mask detection processing one time!------------")

      image_path='/home/sk/catkin_ws/src/test/scripts/p_e.png'
      cv_image = cv2.imread(image_path)

      # read a image using opencv
      # change to your real image path    

      print(cv_image.shape)
      #cv2.imshow("Pikachu", cv_image)
      msg_image = bridge.cv2_to_imgmsg(cv_image, encoding = "bgr8") 

      stamp = rospy.Time.now()
      msg_image.header.frame_id = "camera_link"
      msg_image.header.stamp = stamp

      image_pub.publish(msg_image)
      rate.sleep()
if __name__ == '__main__':
try:
  rospy.init_node('image_pub_node', anonymous=True)
  main()
  rospy.spin()
except KeyboardInterrupt:
  print("Shutting down")
  sys.exit(0)
  pass

내 구독자 코드 :

class ImageWidget(QtWidgets.QWidget):
#def callback(self,data):
def callback(self,rosdata):
  global cv_image      
  #self.bridge = CvBridge()
  self.bridge = CvBridge()
  #print("in callback")
  rate = rospy.Rate(10)
  rate.sleep() 
  try:
    cv_image = self.bridge.imgmsg_to_cv2(rosdata, "bgr8")
    #cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")    

  except CvBridgeError as e:                            
      print(e)


def __init__(self, parent=None):

    super(ImageWidget, self).__init__(parent)

    self.button = QtWidgets.QPushButton('Show picture')
    self.button.clicked.connect(self.main)
    self.image_frame = QtWidgets.QLabel()

    self.layout = QtWidgets.QVBoxLayout()
    self.layout.addWidget(self.button)
    self.layout.addWidget(self.image_frame)
    self.setLayout(self.layout)

def main(self):

    rospy.init_node('image_sub_node', anonymous=True)
    self.image_sub = rospy.Subscriber("/image", Image, self.callback, queue_size=1, buff_size=52428800)
    
    rate = rospy.Rate(50) #50Hz
    bridge = CvBridge()
  
    while not rospy.is_shutdown():
      print("------------Mask detection processing one time!------------")

      try:
        self.cv_image = cv2.imread('Image')
        self.cv_image = QtGui.QImage(self.cv_image.data, self.cv_image.shape[1], self.cv_image.shape[0], QtGui.QImage.Format_RGB888).rgbSwapped()
        self.image_frame.setPixmap(QtGui.QPixmap.fromImage(self.cv_image))
      except Exception:
        continue

        rate.sleep()
if __name__ == '__main__':
try:
  app = QtWidgets.QApplication(sys.argv)
  image_widget = ImageWidget()
  image_widget.show()
  sys.exit(app.exec_())
  rospy.init_node('image_sub_node', anonymous=True)
  main()
  rospy.spin()
except KeyboardInterrupt:
  pass
Eyllanesc

exec_ () 메서드는 이벤트 루프를 실행하므로 Qt가 실행을 마친 후에 만 ​​실행이 완료되고 sys.exit와 연결하면 후속 코드가 실행되지 않습니다.

반면에 while 루프를 사용해서는 안되지만 이벤트 루프 만 사용하고 신호를 사용하여 콜백 (보조 스레드에서 실행 됨)의 정보를 창으로 보내면됩니다.

import sys

from PyQt5 import QtCore, QtGui, QtWidgets
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
import rospy
import cv2


class SubscriberManager(QtCore.QObject):
    imageChanged = QtCore.pyqtSignal(QtGui.QImage)

    def __init__(self, parent=None):
        super(SubscriberManager, self).__init__(parent)
        self.bridge = CvBridge()
        self.subscriber = None

    def start(self, name):
        self.stop()
        self.subscriber = rospy.Subscriber(
            name, Image, self._callback, queue_size=1, buff_size=52428800
        )

    def stop(self):
        if self.subscriber is not None:
            self.subscriber.unregister()
            self.subscriber = None

    def _callback(self, rosdata):
        try:
            cv_image = self.bridge.imgmsg_to_cv2(rosdata, "bgr8")
        except CvBridgeError as e:
            print(e)
        else:
            src = cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB)
            h, w, ch = src.shape
            bytesPerLine = ch * w
            qImg = QtGui.QImage(
                src.data, w, h, bytesPerLine, QtGui.QImage.Format_RGB888
            )
            self.imageChanged.emit(qImg)


class ImageWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ImageWidget, self).__init__(parent)

        self.button = QtWidgets.QPushButton("Show picture")
        self.image_frame = QtWidgets.QLabel()

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.button)
        lay.addWidget(self.image_frame)

        self.subscribe_manager = SubscriberManager()

        self.subscribe_manager.imageChanged.connect(self.on_image_changed)
        self.button.clicked.connect(self.start)

    def start(self):
        self.subscribe_manager.start("/image")

    @QtCore.pyqtSlot(QtGui.QImage)
    def on_image_changed(self, image):
        self.image_frame.setPixmap(QtGui.QPixmap.fromImage(image))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    rospy.init_node("image_sub_node", anonymous=True)

    image_widget = ImageWidget()
    image_widget.show()
    sys.exit(app.exec_())

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

업데이트가 게시 될 때까지 주제 구독자는 아무것도 얻을 수 없습니다.

분류에서Dev

자바 : Tiff 이미지 파일을 읽을 수 없습니다.

분류에서Dev

자산 카탈로그에서 Swift 이미지를 읽을 수 없습니다.

분류에서Dev

OpenFileDialog가 이미지를 읽을 수 없습니다.

분류에서Dev

자바 NIO는 JRT 이미지에서 파일을 읽을 수 없습니다

분류에서Dev

오라클 DB에서 독일어 문자를 읽을 수 없습니다.

분류에서Dev

Swift-(문자열) 데이터를 읽을 수 없습니다.

분류에서Dev

정의되지 않은 (rxJS-구독)의 '구독 취소'속성을 읽을 수 없습니다.

분류에서Dev

CMD가 입력 문자를 올바르게 읽을 수 없습니다.

분류에서Dev

JQuery와 3.4.1은 정의의 자산 가치 '를 읽을 수 없습니다

분류에서Dev

그룹 MailChimp API 3.0 C #에 구독자를 추가 할 수 없습니다.

분류에서Dev

TypeError : 정의되지 않은 속성 '문자'를 읽을 수 없습니다.

분류에서Dev

예외 : TypeError : 업그레이드 후 정의되지 않은 '구독'속성을 읽을 수 없습니다.

분류에서Dev

사용자가 HUAWEI IAP를 사용하여 상품을 구독하려고하는데 결제 페이지에 액세스 할 수 없습니다.

분류에서Dev

나는 .txt 인 모든 숫자를 읽을 수 없습니다

분류에서Dev

Pytesseract는 단순한 숫자를 읽을 수 없습니다.

분류에서Dev

Java-외국 문자를 읽을 수 없습니다.

분류에서Dev

소유자는 / proc / $ pid / io를 읽을 수 없습니다.

분류에서Dev

fget은 개행 문자를 읽을 수 없습니다.

분류에서Dev

소문자 반응 js를 읽을 수 없습니다.

분류에서Dev

TypeError : 사용자에게 메시지를 보내려고 할 때 정의되지 않은 '보내기'속성을 읽을 수 없습니다.

분류에서Dev

"정의되지 않은 속성 'url'을 읽을 수 없습니다."가 이미 정의되어 있지만

분류에서Dev

ConfigurationManager 파서가 C #에서 특수 문자를 읽을 수 없습니다.

분류에서Dev

Bash의 사용자 입력에서 변수를 읽을 수 없습니다.

분류에서Dev

TypeError : 정의되지 않은 '사용자'속성을 읽을 수 없습니다.

분류에서Dev

정의되지 않은 '초대 자'속성을 읽을 수 없습니다.

분류에서Dev

OpenCV : 16 비트 깊이의 단일 채널 png 이미지를 올바르게 읽을 수 없습니다.

분류에서Dev

fgets () 함수를 사용하여 루프 구조 내부의 문자열을 읽을 수 없습니다.

분류에서Dev

Angular 9 TypeError : 정의되지 않은 '구독'속성을 읽을 수 없습니다.

Related 관련 기사

  1. 1

    업데이트가 게시 될 때까지 주제 구독자는 아무것도 얻을 수 없습니다.

  2. 2

    자바 : Tiff 이미지 파일을 읽을 수 없습니다.

  3. 3

    자산 카탈로그에서 Swift 이미지를 읽을 수 없습니다.

  4. 4

    OpenFileDialog가 이미지를 읽을 수 없습니다.

  5. 5

    자바 NIO는 JRT 이미지에서 파일을 읽을 수 없습니다

  6. 6

    오라클 DB에서 독일어 문자를 읽을 수 없습니다.

  7. 7

    Swift-(문자열) 데이터를 읽을 수 없습니다.

  8. 8

    정의되지 않은 (rxJS-구독)의 '구독 취소'속성을 읽을 수 없습니다.

  9. 9

    CMD가 입력 문자를 올바르게 읽을 수 없습니다.

  10. 10

    JQuery와 3.4.1은 정의의 자산 가치 '를 읽을 수 없습니다

  11. 11

    그룹 MailChimp API 3.0 C #에 구독자를 추가 할 수 없습니다.

  12. 12

    TypeError : 정의되지 않은 속성 '문자'를 읽을 수 없습니다.

  13. 13

    예외 : TypeError : 업그레이드 후 정의되지 않은 '구독'속성을 읽을 수 없습니다.

  14. 14

    사용자가 HUAWEI IAP를 사용하여 상품을 구독하려고하는데 결제 페이지에 액세스 할 수 없습니다.

  15. 15

    나는 .txt 인 모든 숫자를 읽을 수 없습니다

  16. 16

    Pytesseract는 단순한 숫자를 읽을 수 없습니다.

  17. 17

    Java-외국 문자를 읽을 수 없습니다.

  18. 18

    소유자는 / proc / $ pid / io를 읽을 수 없습니다.

  19. 19

    fget은 개행 문자를 읽을 수 없습니다.

  20. 20

    소문자 반응 js를 읽을 수 없습니다.

  21. 21

    TypeError : 사용자에게 메시지를 보내려고 할 때 정의되지 않은 '보내기'속성을 읽을 수 없습니다.

  22. 22

    "정의되지 않은 속성 'url'을 읽을 수 없습니다."가 이미 정의되어 있지만

  23. 23

    ConfigurationManager 파서가 C #에서 특수 문자를 읽을 수 없습니다.

  24. 24

    Bash의 사용자 입력에서 변수를 읽을 수 없습니다.

  25. 25

    TypeError : 정의되지 않은 '사용자'속성을 읽을 수 없습니다.

  26. 26

    정의되지 않은 '초대 자'속성을 읽을 수 없습니다.

  27. 27

    OpenCV : 16 비트 깊이의 단일 채널 png 이미지를 올바르게 읽을 수 없습니다.

  28. 28

    fgets () 함수를 사용하여 루프 구조 내부의 문자열을 읽을 수 없습니다.

  29. 29

    Angular 9 TypeError : 정의되지 않은 '구독'속성을 읽을 수 없습니다.

뜨겁다태그

보관