gpt4 book ai didi

c++ - 使用 OpenCV 和 OpenNI 测量两点之间的距离

转载 作者:太空宇宙 更新时间:2023-11-03 22:06:41 24 4
gpt4 key购买 nike

我正在玩 OpenCV 2.4.0 中内置的 OpenNI 访问,我正在尝试测量深度图中两点之间的距离。到目前为止我已经试过了:

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>

using namespace cv;
using namespace std;

Point startPt(0,0);
Point endPt(0,0);

void onMouse( int event, int x, int y, int flags, void* )
{
if( event == CV_EVENT_LBUTTONUP) startPt = Point(x,y);
if( event == CV_EVENT_RBUTTONUP) endPt = Point(x,y);
}

int main( int argc, char* argv[] ){
VideoCapture capture;
capture.open(CV_CAP_OPENNI);
//capture.set( CV_CAP_PROP_OPENNI_REGISTRATION , 0);
unsigned t0=clock();
if( !capture.isOpened() ){
cout << "Can not open a capture object." << endl;
return -1;
}
unsigned elapsed=clock()-t0;
cout << "initialized in "<< elapsed <<" s. ready!" << endl;
namedWindow( "depth", 1 );
setMouseCallback( "depth", onMouse, 0 );
for(;;){
Mat depthMap;
if( !capture.grab() ){
cout << "Can not grab images." << endl;
return -1;
}else{
Mat show,real,valid;
if( capture.retrieve( depthMap, CV_CAP_OPENNI_DEPTH_MAP ) ){
depthMap.convertTo( show, CV_8UC1, 0.05f);
}
capture.retrieve(valid,CV_CAP_OPENNI_VALID_DEPTH_MASK);
if( capture.retrieve(real, CV_CAP_OPENNI_POINT_CLOUD_MAP)){
unsigned int sp = valid.at<unsigned char>(startPt.x, startPt.y);
unsigned int ep = valid.at<unsigned char>(endPt.x, endPt.y);
if(sp == 255 && ep == 255){
Vec3f s = real.at<Vec3f>(startPt.x, startPt.y);
Vec3f e = real.at<Vec3f>(endPt.x, endPt.y);
float dx = e[0]-s[0];
float dy = e[1]-s[1];
float dz = e[2]-s[2];
float dist = sqrt(dx*dx + dy*dy + dz*dz);
putText(show,format("distance: %f m\n",dist),Point(10,10),FONT_HERSHEY_PLAIN,1,Scalar(255));
}
}
circle(show,startPt,3,Scalar(255),3);
circle(show,endPt,3,Scalar(192),3);
line(show,startPt,endPt,Scalar(128));
imshow("depth",show);
}
if( waitKey( 30 ) >= 0 ) break;
}

}

但我有几个问题:

  1. 除非我首先检查程序中有效深度掩码中的值有时会崩溃(我想是因为数据不好)
  2. 据我所知,点云 map 返回以米为单位的 XYZ 数据 (CV_32FC3),但我在屏幕上看到的数字看起来不对。

我是否使用了正确的方法来检索 xyz 值和计算距离?

我可能遗漏了任何细节吗?

最佳答案

  1. 我运行了代码,但即使我注释掉 if(sp == 255 && ep == 255) 也无法使其崩溃.它经常发生吗?我没有使用过 OpenNI 驱动程序,但在 Microsoft 驱动程序中也有一个无效值(例如,当表面是镜面反射时)。 “太近”或“太远”也有不同的值。在这种情况下,OpenNI 会不会返回垃圾?

  2. 尝试交换 x 和 y:

    Vec3f s = real.at<Vec3f>(startPt.y, startPt.x);        
    Vec3f e = real.at<Vec3f>(endPt.y, endPt.x);

(因此:)

unsigned int sp = valid.at<unsigned char>(startPt.y, startPt.x);
unsigned int ep = valid.at<unsigned char>(endPt.y, endPt.x);

语法是cv::Mat::at<_Tp>(int y, int x)或者它是否能更好地帮助您 cv::Mat::at<_Tp>(int row, int column)我测量了一些距离,它对我来说效果很好。

此外,你实际上为你获得的每一帧计算 3D 点和距离,这是故意的吗?因为即使您一次选择图像中的两个 2D 点,用于计算距离的相应 3D 点也可能由于噪声而在每一帧中发生变化。

关于c++ - 使用 OpenCV 和 OpenNI 测量两点之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11962203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com