博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kinect2.0-空间长度测量
阅读量:6717 次
发布时间:2019-06-25

本文共 2605 字,大约阅读时间需要 8 分钟。

1.

鼠标左键按下选择起点,拖动鼠标,左键放开,确定终点。

img_b8681109536af93105198fdf88c4965a.png
实现效果1
img_622b2e0506dc262aa9ac91fe11028b27.png
实现效果2

2.

在linux下使用libfreenect2开源多平台驱动来获取kinect2.0的传感器信息,得到深度信息,并通过libfreenect2提供的函数,来得到相机坐标系中某一点的空间坐标。

img_4f64dedc4df690d57aef4191c8780d73.png

3.

运用鼠标操作函数(setMouseCallback),来获取画面中的两个点,并用直线将他们连接起来,通过(2)中的方法得到两点的空间坐标:A(x1,y1,z1),B(x2,y2,z2)。通过简单计算,便可以求得两点的实际距离。



4.

关键代码:

while(!protonect_shutdown)    {        listener.waitForNewFrame(frames);        libfreenect2::Frame *rgb = frames[libfreenect2::Frame::Color];        libfreenect2::Frame *depth = frames[libfreenect2::Frame::Depth];        cv::Mat(rgb->height, rgb->width, CV_8UC4, rgb->data).copyTo(rgbmat);        cv::Mat(depth->height, depth->width, CV_32FC1, depth->data).copyTo(depthmat);        cv::Mat(registered.height, registered.width, CV_8UC4, registered.data).copyTo(rgbd);        registration->apply(rgb, depth, &undistorted, &registered, true, &depth2rgb);        cv::Mat(registered.height, registered.width, CV_8UC4, registered.data).copyTo(rgbd);        //resize(rgbmat, dst1, Size(), c, d, INTER_NEAREST);        inRange(depthmat,Scalar(a),Scalar(b),dst);        //morphologyEx(dst,dst,MORPH_OPEN,kernel);        findContours(dst,contours,hireachy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE,Point(0,0));        if (contours.size() > 0)        {            double maxArea=0;            for (int i = 0; i < contours.size(); i++)            {                double area = contourArea(contours[static_cast
(i)]); if (area > maxArea) { maxArea = area; rect = boundingRect(contours[static_cast
(i)]); minEnclosingCircle(contours[static_cast
(i)], center, radius); } } } setMouseCallback("main",on_MouseHandle); // 鼠标操作 registration->getPointXYZ(&undistorted, pt11.y, pt11.x,x1, y1, z1); // 像素坐标转化为空间坐标 registration->getPointXYZ(&undistorted,pt21.y,pt21.x,x2, y2, z2); //rectangle(rgbd, rect, Scalar(0,255,0),2); line(rgbd, pt11, pt21, Scalar(0,255,0)); // 划线 l = sqrt(pow((x1-x2),2) + pow((y1-y2),2) + pow((z1-z2),2)); cout << "length:" << l << "m" <
0 && ((key & 0xFF) == 27)); // shutdown on escape listener.release(frames); } dev->stop(); dev->close(); delete registration; #endif std::cout << "stop!" << std::endl; return 0;}void on_MouseHandle(int event, int x, int y, int flags, void* ustc){ if (event == EVENT_LBUTTONDOWN) { Point pt1 = Point(x, y); pt11 = pt1; } else if (event == EVENT_LBUTTONUP) { Point pt2 = Point(x, y); pt21 = pt2; }}

转载地址:http://glumo.baihongyu.com/

你可能感兴趣的文章
约瑟夫问题求解
查看>>
4月12日
查看>>
基于WinSvr2012共享文件夹的Hyper-V实时迁移之三实时迁移的实现及验证
查看>>
证件照片换背景
查看>>
并发编程笔记二:synchronized锁住了谁?
查看>>
js打字效果
查看>>
用铁路局来比喻流程管理系统,工作流引擎,表单.
查看>>
jQuery的发展史,你知道吗?
查看>>
JavaWeb:实现文件上传
查看>>
mysql: unknown variable 'character_set_client=UTF8'
查看>>
zabbix3.0监控的配置
查看>>
SSL/TLS部署最佳实践
查看>>
Screen字符桌面共享
查看>>
2015-08-22 linux命令练习3
查看>>
我的hosts文件
查看>>
Google偏爱HTTPS SSL加密链接网站
查看>>
MapReduce作业运行第三方配置文件的共享方法
查看>>
PHP 用户注册
查看>>
26_事务语法
查看>>
Linux常见命令详解1
查看>>