물체 감지 Gazebo 시뮬레이션 환경을 구현하려고합니다. 이를 위해 https://dev.px4.io/v1.9.0/en/simulation/gazebo.html 이 사이트를 사용 합니다. QGroundControl에서 비디오를 받고 있습니다. 또한 Python을 통해 USB 웹캠에서 비디오를 수신하고 개체를 감지합니다. 이제 python Opencv videocapture 함수에서 gstreamer UDP 비디오를 받고 싶습니다. 그러나 오류가 발생합니다.
File "gstreamer_try.py", line 120, in <module>
feed_dict={image_tensor: image_np_expanded})
File "/home/hanco/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/client/session.py", line 956, in run
run_metadata_ptr)
File "/home/hanco/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/client/session.py", line 1149, in _run
np_val = np.asarray(subfeed_val, dtype=subfeed_dtype)
File "/home/hanco/anaconda3/lib/python3.7/site-packages/numpy/core/_asarray.py", line 85, in asarray
return array(a, dtype, copy=False, order=order)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
첫째, gstreamer 발신자와 수신자를 작성하려고했습니다.
gstreamer_sender.py :
import socket
import numpy as np
import cv2 as cv
addr = ("127.0.0.1", 5655)
buf = 512
width = 640
height = 480
cap = cv.VideoCapture("/home/hanco/Desktop/duckduck.mp4")
cap.set(3, width)
cap.set(3, height)
code = 'start'
code = ('start' + (buf - len(code)) * 'a').encode('utf-8')
if __name__ == '__main__':
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while(cap.isOpened()):
ret, frame = cap.read()
if ret:
s.sendto(code, addr)
data = frame.tostring()
for i in range(0, len(data), buf):
s.sendto(data[i:i+buf], addr)
# cv.imshow('send', frame)
# if cv.waitKey(1) & 0xFF == ord('q'):
# break
else:
break
# s.close()
# cap.release()
# cv.destroyAllWindows()
gstreamer_receiver.py :
import socket
import numpy as np
import cv2 as cv
addr = ("127.0.0.1", 5600)
buf = 512
width = 640
height = 480
code = b'start'
num_of_chunks = width * height * 3 / buf
if __name__ == '__main__':
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(addr)
chunk, _ = s.recvfrom(buf)
chunk.startswith(code)
start = True
while True:
chunks = []
while len(chunks) < num_of_chunks:
chunk, _ = s.recvfrom(buf)
if start:
chunks.append(chunk)
byte_frame = b''.join(chunks)
frame = np.frombuffer(byte_frame, dtype=np.uint8).reshape(width, height, 3)
cv.imshow('recv', frame)
if cv.waitKey(1) & 0xFF == ord('q'):
break
s.close()
cv.destroyAllWindows()
잘 작동하고 포트만 변경하여 가제보에서 영상을받을 수 있다는 것을 깨달았습니다. Gazebo 기본 포트는 5600 입니다. 하지만 작동하지 않았습니다.
위의 코드를 사용하여 여기에 구현하고 싶습니다.
cap = cv2.VideoCapture(GSTREAMEAR_VIDEO_INPUT)
이 줄에 오류가 있습니다.
feed_dict={image_tensor: image_np_expanded})
# Visualization of the results of a detection.
vis_util.visualize_boxes_and_labels_on_image_array(
image_np,
np.squeeze(boxes),
np.squeeze(classes).astype(np.int32),
np.squeeze(scores),
category_index,
use_normalized_coordinates=True,
line_thickness=8)
다음 코드는 오류없이 실행 중입니다.
# Read video
video = cv2.VideoCapture("udpsrc port=5600 ! application/x-rtp,payload=96,encoding-name=H264 ! rtpjitterbuffer mode=1 ! rtph264depay ! h264parse ! decodebin ! videoconvert ! appsink", cv2.CAP_GSTREAMER);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다