How do I get readImage (ROS) to work?
조회 수: 11 (최근 30일)
이전 댓글 표시
I have a file recorded with a RealSense-camera and it is saved as a rosbag file .bag.
I want to access the individual frames as images through Matlab and I have found information how to do from different forums. One example is from Matlab answers: https://se.mathworks.com/matlabcentral/answers/407981-access-images-from-within-a-rosbag
The problem is that that the function readImage doesn't work.
Depending on how I use it I get different error messages.
Either:
Array indices must be positive integers or logical values.
The error is generated with this code:
bag = rosbag('20190402_093734.bag');
bagInfo = rosbag('info', '20190402_093734.bag')
bSel = select(bag, 'Topic', '/device_0/sensor_1/Color_0/image/data');
msgs = readMessages(bSel,"DataFormat","struct");
img = readImage(msgs{1});
Or:
Undefined function or variable 'readImage'.
The error is generated with this code:
bag = rosbag('20190402_093734.bag');
bagselect1 = select(bag, 'Topic', '/device_0/sensor_0/Depth_0/image/data')
bagselect2 = select(bag, 'Time', [1 5], 'Topic', '/device_0/sensor_0/Depth_0/image/data')
bagselect2.AvailableTopics{1,end}
bagselect3 = select(bagselect2, 'Time', [1 5])
msgs = readMessages(bagselect3,"DataFormat","struct");
img = readImage(msgs{1});
I thought there was a problem with my installation of ROS so I tried using the online version of MATLAB but I got the same error message there.
I am assuming that there is a very simple, logical solution to this but I have no idea of what it might be. Could it be a problem with the .ros-file?
댓글 수: 0
채택된 답변
Cam Salzberger
2019년 4월 11일
Hello Ulrik,
It's good that you are experimenting with the 'DataFormat','struct' option for extracting messages from rosbags, since it is a big performance improvement. Unfortunately, the convenience functions (readImage, readPointCloud, etc.) don't yet support accepting structs as input, and are expecting ROS message objects. If you want to use readImage, I would suggest leaving off the 'DataFormat','struct' option, and passing the output to readImage. Otherwise, you can manually extract the image from the ROS message structure.
-Cam
댓글 수: 5
Mohamed Atia
2019년 12월 27일
Could you please post the code that you used to "create an empty message and copy all the content (except Header) " so you can use readImage ? Thanks
Cam Salzberger
2020년 1월 2일
편집: Cam Salzberger
2020년 1월 2일
Something like this should work, though I haven't tested it:
msgStructs = readMessages(bagSel, 'DataFormat', 'struct');
msg = copyImage(msgStructs{1});
I = readImage(msg);
function msg = copyImage(msgStruct)
msg = rosmessage(msgStruct.MessageType);
fNames = fieldnames(msg);
for k = 1:numel(fNames)
if ~any(strcmp(fNames{k}, {'MessageType', 'Header'}))
msg.(fNames{k}) = msgStruct.(fNames{k});
end
end
end
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Specialized Messages에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!