使用 OpenCV 和 OpenNI 测量 2 点之间的距离
Measuring distance between 2 points with OpenCV and OpenNI
我正在使用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 mn",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;
}
}
但我有几个问题:
- 除非我先检查程序的有效深度掩码中的值有时会崩溃(我想是由于数据不好)
- 据我了解,点云图以米 (CV_32FC3) 为单位返回 XYZ 数据,但我在屏幕上看到的数字看起来是错误的。
我是否使用正确的方法来检索 xyz 值和计算距离?
我可能遗漏的任何细节?
- 我
运行了代码,但即使我注释掉
if(sp == 255 && ep == 255)
也无法让它崩溃。它经常发生吗?我没有使用过OpenNI驱动程序,但是例如,在Microsoft驱动程序中,还有一个无效值(例如,当表面是镜面反射时)。"太近"或"太远"也有不同的值。会不会是OpenNI在这种情况下返回垃圾?尝试切换 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++程序计算圆锥体的体积、球体的体积、八边形的面积和两点之间的距离
- 计算所有对之间的曼哈顿距离
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 两个有符号数字之间的距离
- 计算车辆之间的距离并设置速度,使距离保持不变,例如 5 米
- 计算两个迭代器之间的距离时"Vector Iterators Incompatible"
- 查找彼此之间具有不同最小距离的随机数
- 相同字符之间的最小距离
- 如何排列二进制字符串以最小化它们之间的距离
- 堆和堆栈之间的距离
- 树节点之间的最大距离中的运行时错误
- 最接近的字符串:在字符串阵列中找到2个字符串之间的最小距离
- 尝试查找数组中点之间的最小距离时的随机垃圾输出
- c++ 从大型数组中读取 3D 坐标并计算它们之间的距离
- 在 OpenCV 中计算 SURF 功能之间的距离
- 计算机如何分配两个变量,我们如何计算两个变量之间的距离?
- 是否有C 功能来计算两个索引之间的距离
- 使用 DirectXMath 获得 2 点之间距离的最佳方法是什么
- <random> 点之间距离最小的uniform_real_distribution
- 确定景观中所有点与具有特定属性的点之间距离的最快方法