c++ 从(视频)帧获取RGB值时出现指针异常英特尔实感

zvokhttg  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(129)

我正在尝试使用Realsense SDK从帧中获取不同的RGB值。这是针对具有RGB的3D深度相机。根据https://github.com/IntelRealSense/librealsense/issues/3364,我需要使用

int i = 100, j = 100; // fetch pixel 100,100
rs2::frame rgb = ...
auto ptr = (uint8_t*)rgb.get_data();
auto stride = rgb.as<rs2::video_frame>().stride();
cout << "R=" << ptr[3*(i * stride + j)];
cout << ", G=" << ptr[3*(i * stride + j) + 1];
cout << ", B=" << ptr[3*(i * stride + j) + 2];

在我的代码中,如果我想获取像素**(x,y)= 1000,1000的值,我会遇到指针异常。当(x,y)= 100,100**时,它每次都有效。Exception thrown: read access violation. ptr was 0x11103131EB9192A.

我将enable_stream设置为cfg.enable_stream(RS2_STREAM_COLOR, WIDTH_COLOR_FRAME, HEIGTH_COLOR_FRAME, RS2_FORMAT_RGB8, 15);,其中在.h文件中:

#define WIDTH_COLOR_FRAME   1920
#define HEIGTH_COLOR_FRAME  1080

这是我的代码。也许它和RS2_FORMAT_RGB8有关?

frameset frames = pl.wait_for_frames();
frame color = frames.get_color_frame();

uint8_t* ptr = (uint8_t*)color.get_data();
int stride = color.as<video_frame>().get_stride_in_bytes();

int i = 1000, j = 1000; // fetch pixel 100,100

cout << "R=" << int(ptr[3 * (i * stride + j)]);
cout << ", G=" << int(ptr[3 * (i * stride + j) + 1]);
cout << ", B=" << int(ptr[3 * (i * stride + j) + 2]);
cout << endl;

先谢了!

oaxa6hgo

oaxa6hgo1#

stride以字节为单位(行的长度以字节为单位),不需要乘以3。

cout << "  R= " << int(ptr[i * stride + (3*j)    ]);
cout << ", G= " << int(ptr[i * stride + (3*j) + 1]);
cout << ", B= " << int(ptr[i * stride + (3*j) + 2]);
92dk7w1h

92dk7w1h2#

我有同样的问题,即使与最后的答案,我仍然得到segfaults。
我发现当你这么做的时候
uint8_t *ptr =颜色.获取数据()
realsense sdk不会增加/跟踪一些内部引用,指针在一段时间后无效,导致segfaults。我的修复方法是将内容复制到本地缓冲区。

  • malloc新的缓冲区与RGB大小。
  • get_data()之后立即将数据复制到新缓冲区。

解决了我所有的问题一切顺利。

相关问题