opencv访问元素出错!!!
用opencv获取Kinect的深度图,想取出每一个像素的深度值但出错。kinect深度信息存在CV_16UC1的Mat里MatdbufferMat1(dheight,d...
用opencv获取Kinect的深度图,想取出每一个像素的深度值 但出错。
kinect深度信息存在CV_16UC1的Mat里
Mat dbufferMat1( dheight, dwidth, CV_16UC1 );
IDepthFrame* pDepthFrame = nullptr;
hResult = pDepthReader->AcquireLatestFrame( &pDepthFrame );
if( SUCCEEDED( hResult ) ){
hResult = pDepthFrame->AccessUnderlyingBuffer( &dbufferSize, reinterpret_cast<UINT16**>( &dbufferMat1.data ) );
现在访问每一个像素,kinect深度图为512*424
for(int y=0;y<424;y++)
for(int x=0;x<512;x++)
{
p_ir[2]=dbufferMat1.at<UINT16>(y,x);
p_ir[0]=x;
p_ir[1]=y;
P_ir[0]=(p_ir[0]-H_ir[0][2])*p_ir[2]/H_ir[0][0];
P_ir[1]=(p_ir[1]-H_ir[1][2])*p_ir[2]/H_ir[1][1];
P_ir[2]=p_ir[2];
for(int i=0;i<3;i++)
{
P_rgb[i]=R[i][0]*P_ir[0]+R[i][1]*P_ir[1]+R[i][2]*P_ir[2]+T[i];
}
p_rgb[0]=ceil((P_rgb[0]* H_rgb[0][0]/P_rgb[2])+H_rgb[0][2]);
p_rgb[1]=ceil((P_rgb[1]* H_rgb[1][1]/P_rgb[2])+H_rgb[1][2]);
if(p_rgb[0]>=0&&p_rgb[0]<REr.cols&&p_rgb[1]>=0&&p_rgb[1]<REr.rows)
{
mapDepthToColor.at<Vec3b>(y,x)=REr.at<Vec3b>(p_rgb[1],p_rgb[0]);
}
else
{
mapDepthToColor.at<Vec3b>(y,x)=Vec3b(255,255,0);
}
}
这程序会运行很短时间 然后在p_ir[2]=dbufferMat1.at<UINT16>(y,x);这句出错
什么原因呢 展开
kinect深度信息存在CV_16UC1的Mat里
Mat dbufferMat1( dheight, dwidth, CV_16UC1 );
IDepthFrame* pDepthFrame = nullptr;
hResult = pDepthReader->AcquireLatestFrame( &pDepthFrame );
if( SUCCEEDED( hResult ) ){
hResult = pDepthFrame->AccessUnderlyingBuffer( &dbufferSize, reinterpret_cast<UINT16**>( &dbufferMat1.data ) );
现在访问每一个像素,kinect深度图为512*424
for(int y=0;y<424;y++)
for(int x=0;x<512;x++)
{
p_ir[2]=dbufferMat1.at<UINT16>(y,x);
p_ir[0]=x;
p_ir[1]=y;
P_ir[0]=(p_ir[0]-H_ir[0][2])*p_ir[2]/H_ir[0][0];
P_ir[1]=(p_ir[1]-H_ir[1][2])*p_ir[2]/H_ir[1][1];
P_ir[2]=p_ir[2];
for(int i=0;i<3;i++)
{
P_rgb[i]=R[i][0]*P_ir[0]+R[i][1]*P_ir[1]+R[i][2]*P_ir[2]+T[i];
}
p_rgb[0]=ceil((P_rgb[0]* H_rgb[0][0]/P_rgb[2])+H_rgb[0][2]);
p_rgb[1]=ceil((P_rgb[1]* H_rgb[1][1]/P_rgb[2])+H_rgb[1][2]);
if(p_rgb[0]>=0&&p_rgb[0]<REr.cols&&p_rgb[1]>=0&&p_rgb[1]<REr.rows)
{
mapDepthToColor.at<Vec3b>(y,x)=REr.at<Vec3b>(p_rgb[1],p_rgb[0]);
}
else
{
mapDepthToColor.at<Vec3b>(y,x)=Vec3b(255,255,0);
}
}
这程序会运行很短时间 然后在p_ir[2]=dbufferMat1.at<UINT16>(y,x);这句出错
什么原因呢 展开
1个回答
展开全部
你看出错信息里面的值,row=424,图像时512x424像素,取值应该是0x0~511x423吧!明显越界了。每台仔细看你的程序,但是你的x,y值双层循环部分:
for(int y=0;y<424;y++)
for(int x=0;x<512;x++)
{
p_ir[2]=dbufferMat1.at<UINT16>(y,x);
是不是缺了一层括号啊!
for(int y=0;y<424;y++)
{
for(int x=0;x<512;x++)
{
p_ir[2]=dbufferMat1.at<UINT16>(y,x);
应该是这样吧!
for(int y=0;y<424;y++)
for(int x=0;x<512;x++)
{
p_ir[2]=dbufferMat1.at<UINT16>(y,x);
是不是缺了一层括号啊!
for(int y=0;y<424;y++)
{
for(int x=0;x<512;x++)
{
p_ir[2]=dbufferMat1.at<UINT16>(y,x);
应该是这样吧!
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家提供动态代理服务器服务的企业,旨在帮助用户更好地管理网络访问和安全。以下是一些关于StormProxies的IP动态代理服务的特点:1. 高匿名性:StormProxies的动态代理服务器具有高匿名性,可以有效...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询