point-position2修改版

说明:

 在共面直线测试中,由于计算误差等原因,共面条件判断不准,但计算结果依然正确。

// point-position2.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/nonfree/features2d.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/legacy/legacy.hpp"
#include<Eigen/Core>  
#include <Eigen/Dense>
#include<math.h>
using namespace cv;int main( int argc, char** argv )
{Mat img_1 = imread("book_in_scene.png");Mat img_2 = imread("book2.png");if( !img_1.data || !img_2.data ){ std::cout<< " --(!) Error reading images " << std::endl; return -1; }//-- Step 1: Detect the keypoints using SURF Detectorint minHessian = 400;SiftFeatureDetector detector( minHessian );//SurfFeatureDetector detector( minHessian );
vector<KeyPoint> keypoints_1, keypoints_2;detector.detect( img_1, keypoints_1 );detector.detect( img_2, keypoints_2 );//-- Step 2: Calculate descriptors (feature vectors)
    SiftDescriptorExtractor extractor;//SurfDescriptorExtractor extractor;
Mat descriptors_1, descriptors_2;extractor.compute( img_1, keypoints_1, descriptors_1 );extractor.compute( img_2, keypoints_2, descriptors_2 );//-- Step 3: Matching descriptor vectors using FLANN matcher
    FlannBasedMatcher matcher;std::vector< DMatch > matches;matcher.match( descriptors_1, descriptors_2, matches );double max_dist = 0; double min_dist = 100;//-- Quick calculation of max and min distances between keypointsfor( int i = 0; i < descriptors_1.rows; i++ ){ double dist = matches[i].distance;if( dist < min_dist ) min_dist = dist;if( dist > max_dist ) max_dist = dist;}//printf("-- Max dist : %f \n", max_dist );//printf("-- Min dist : %f \n", min_dist );//-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist )//-- PS.- radiusMatch can also be used here.std::vector< DMatch > good_matches;for( int i = 0; i < descriptors_1.rows; i++ ){ if( matches[i].distance < 2*min_dist ){ good_matches.push_back( matches[i]); }}//-- Draw only "good" matches
    Mat img_matches;drawMatches( img_1, keypoints_1, img_2, keypoints_2,good_matches, img_matches);//-- Show detected matches//imshow( "Good Matches", img_matches );//imwrite("Lena_match_surf.jpg",img_matches);//imwrite("Lena_match_sift.jpg",img_matches);//good_matches[i].queryIdx保存着第一张图片匹配点的序号,keypoints_1[good_matches[i].queryIdx].pt.x 为该序号对应的点的x坐标。y坐标同理//good_matches[i].trainIdx保存着第二张图片匹配点的序号,keypoints_2[good_matches[i].trainIdx].pt.x 为为该序号对应的点的x坐标。y坐标同理printf( "--Keypoint 1:%f,%f: %d  -- Keypoint 2:%f,%f: %d  \n",  keypoints_1[good_matches[0].queryIdx].pt.x,keypoints_1[good_matches[0].queryIdx].pt.y,good_matches[0].queryIdx, keypoints_2[good_matches[0].trainIdx].pt.x,keypoints_2[good_matches[0].trainIdx].pt.y,good_matches[0].trainIdx );/*_______________________________________________________________________________________________________________________________*/double x_inImage1,y_inImage1,x_inImage2,y_inImage2,y,X,Y,alpha,gamma;//像面坐标(x,y)和图像尺寸(X,Y)以及成像视场角(alpha,gamma)double x1,y1,z1,x2,y2,z2;//双站坐标double alpha1,gamma1;//双站俯仰角和偏转角double alpha2,gamma2;//赋予初始值alpha1=45;alpha1=90;//测试共面gamma1=45;alpha2=270;gamma2=45;X=640;Y=480;double FOVx=10;double FOVy=FOVx*Y/X;x1=0,y1=0,z1=0;x2=0,y2=200,z2=0;/*    //测角偏差补偿x_inImage1=keypoints_1[good_matches[0].queryIdx].pt.x;//目标点坐标由匹配所得y_inImage1=keypoints_1[good_matches[0].queryIdx].pt.y;x_inImage2=keypoints_2[good_matches[0].queryIdx].pt.x;y_inImage2=keypoints_2[good_matches[0].queryIdx].pt.y;double deviation_alpha1=(x_inImage1-X/2)/X*FOVx;double deviation_alpha2=(x_inImage2-X/2)/X*FOVx;double deviation_gamma1=(y_inImage1-Y/2)/X*FOVy;double deviation_gamma2=(y_inImage2-Y/2)/X*FOVy;alpha1=alpha1+deviation_alpha1;alpha2=alpha2+deviation_alpha2;gamma1=gamma1+deviation_gamma1;gamma2=gamma2+deviation_gamma2;
*///开始计算double pi=16*(atan(1.0/5))-4*atan(1.0/239);//精确定义圆周率std::cout<<"pi为:"<<pi<<std::endl;alpha1=alpha1*pi/180;//角度弧度转换gamma1=gamma1*pi/180;alpha2=alpha2*pi/180;gamma2=gamma2*pi/180;//    std::cout<<"cos(alpha1)为:"<<cos(alpha1)<<std::endl;
//    std::cout<<"cos(gamma1)为:"<<cos(gamma1)<<std::endl;double m1=(cos(alpha1))*(cos(gamma1));double n1=(sin(alpha1))*(cos(gamma1));double p1=sin(gamma1);double m2=(cos(alpha2))*(cos(gamma2));double n2=(sin(alpha2))*(cos(gamma2));double p2=sin(gamma2);std::cout<<"方向向量1为:"<<m1<<""<<n1<<""<<p1<<std::endl;std::cout<<"方向向量2为:"<<m2<<""<<n2<<""<<p2<<std::endl;double coplane;//共面判断coplane=(x2-x1)*(n1*p2-n2*p1)-(y2-y1)*(m1*p2-m2*p1)+(z2-z1)*(m1*n2-m2*n1);//coplane=0共面if(coplane){//计算公垂线方向向量A1、B1、C1double A1=n1*p2-n2*p1;double B1=p1*m2-p2*m1;double C1=m1*n2-m2*n1;//
        double A2=n2*C1-p2*B1;double B2=p2*A1-m2*C1;double C2=m2*B1-n2*A1;double A3=n1*C1-p1*B1;double B3=p1*A1-m1*C1;double C3=m1*B1-n1*A1;double delta1=n1*(B1*C2-B2*C1)+m1*(A1*C2-A2*C1);double delta2=n2*(B1*C3-B3*C1)+m2*(A1*C3-A3*C1);double D1=A2*(x2-x1)+B2*(y2-y1)+C2*(z2-z1);double D2=A3*(x1-x2)+B3*(y1-y2)+C3*(z1-z2);double Xg,Yg,Zg,Xh,Yh,Zh,Xtarget,Ytarget,Ztarget;//两直线垂足G和H点坐标,目标点在其中点位置。Xg=x1-(D1*m1*C1)/delta1;Yg=y1-(D1*n1*C1)/delta1;Zg=z1+D1*(A1*m1+B1*n1)/delta1;Xh=x2-(D2*m2*C1)/delta2;Yh=y2-(D2*n2*C1)/delta2;Zh=z2+D2*(A1*m2+B1*n2)/delta2;Xtarget=(Xg+Xh)/2;Ytarget=(Yg+Yh)/2;Ztarget=(Zg+Zh)/2;std::cout<<"目标坐标为:"<<Xtarget<<""<<Ytarget<<""<<Ztarget<<std::endl<<std::endl;}else//两线共面且相交,引入参数t
    {double t;t=(p2*(y1-y2)+n2*(z2-z1))/(n2*p1-p2*n1);double Xtarget,Ytarget,Ztarget;Xtarget=x1+m1*t;Ytarget=y1+n1*t;Ztarget=z1+p1*t;std::cout<<"目标坐标为:"<<Xtarget<<""<<Ytarget<<""<<Ztarget<<std::endl<<std::endl;}getchar();//waitKey(0);return 0;
}

 

共面直线测试中,没有跳进共面直线解析交点中,但结果依然正确:

单独测试共面直线求交点结果为:

 

转载于:https://www.cnblogs.com/wxl845235800/p/9067754.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习总结(十六)系统用户及用户组管理

先来认识两个文件/etc/passwd/etc/shadow我们打印出首尾三行&#xff0c;来了解下&#xff1a;每行由&#xff1a;分割为7段&#xff0c;每段含义为&#xff1a;第一段&#xff1a;用户名&#xff0c;比如root 用户&#xff0c;普通用户test,lv,test1第二段&#xff1a;早期存放…

hadoop综合大作业

Hadoop综合大作业 要求&#xff1a; 1.用Hive对爬虫大作业产生的文本文件&#xff08;或者英文词频统计下载的英文长篇小说&#xff09;词频统计。 词频统计的截图如下&#xff1a; 上次我所使用的文章是一篇中文文章&#xff0c;所以这次我用了一篇英文文档来进行分词&#xf…

MPI对道路车辆情况的Nagel-Schreckenberg 模型进行蒙特卡洛模拟

平台Ubuntu 16.04&#xff0c;Linux下MPI环境的安装见链接&#xff1a;https://blog.csdn.net/lusongno1/article/details/61709460据 Nagel-Schreckenberg 模型&#xff0c;车辆的运动满足以下规则&#xff1a;1. 假设当前速度是 v &#xff0c;和前一辆车的距离为d。2. 如…

Android 中.aar文件生成方法与用法

https://i.cnblogs.com/EditPosts.aspx?opt1 无论是用Eclipse还是用Android Studio做android开发&#xff0c;都会接触到jar包&#xff0c;全称应该是&#xff1a;Java Archive&#xff0c;即java归档文件。在用AS的过程中&#xff0c;你会发现有aar这么个东西&#xff0c;经查…

windows10上安装mysql

环境&#xff1a;windwos 10&#xff08;1511&#xff09; 64bit、mysql 5.7.14 一、下载mysql1. 在浏览器里打开mysql的官网http://www.mysql.com/2. 进入页面顶部的"Downloads"3. 打开页面底部的“Community(GPL) Downloads” 4. 在页面中间的位置找到我们windows上…

sql server 内存初探

sql server 内存初探 原文:sql server 内存初探一. 前言 对于sql server 这个产品来说&#xff0c;内存这块是最重要的一个资源&#xff0c; 当我们新建一个会话&#xff0c;相同的sql语句查询第二次查询时间往往会比第一次快&#xff0c;特别是在sql统计或大量查询数据输出时&…

使用TcpClient的例程

例子1&#xff1a; ///假定一切工作正常 ///连接后发送一次消息&#xff0c;然后不停接受消息并且打印 主要API说明 TcpClient clientnew TcpClient(); client.Connect("127.0.0.1",8888); NetworkStream streamclient.GetStream(); 发送&#xff1a; stream.Write(o…

20172324 2017-2018-2《程序设计与数据结构》实验三报告

20172324 2017-2018-2《程序设计与数据结构》实验三报告 课程&#xff1a;《程序设计与数据结构》 班级&#xff1a; 1723 姓名&#xff1a; 曾程 学号&#xff1a;20172324 实验教师&#xff1a;王志强 实验日期&#xff1a;2018年5月23日 必修/选修&#xff1a; 必修 一、实验…

mysql if--else

SQL之case when then用法 case具有两种格式。简单case函数和case搜索函数。 --简单case函数 case sexwhen 1 then 男when 2 then 女’else 其他 end --case搜索函数 case when sex 1 then 男when sex 2 then 女else 其他 end 这两种方式&#xff0c;可以实现相同的功能。简…

笔记41 Spring Web Flow——Demo

订购披萨的应用整体比较比较复杂&#xff0c;现拿出其中一个简化版的流程&#xff1a;即用户访问首页&#xff0c;然后输入电话号&#xff08;假定未注册&#xff09;后跳转到注册页面&#xff0c;注册完成后跳转到配送区域检查页面&#xff0c;最后再跳转回首页。通过这个简单…

CSS3弹性盒子Flex

CSS3弹性盒子Flex 基础知识和术语 原文链接&#xff1a;https://css-tricks.com/snippets/css/a-guide-to-flexbox/ 父级&#xff08;flex容器&#xff09;的属性 &#xff03;显示 这定义了一个flex容器; 内联或块取决于给定的值。它为所有直接的孩子提供了一个弹性环境。 .co…

cloudera manager的7180 web界面访问不了的解决办法(图文详解)

说在前面的话 我的机器是总共4台&#xff0c;分别为ubuntucmbigdata1、ubuntucmbigdata2、ubuntucmbigdata3和ubuntucmbigdata4。&#xff08;注意啦&#xff0c;以下是针对Ubuntu系统的&#xff09; 在ubuntucmbigdata1上执行了 sudo apt-get install cloudera-manager-daemon…

2018 ios开发者账号同意新协议加联系电话教程

苹果开发者账号经常会更新协议&#xff0c;需要同意新的协议账号才能正常使用。 1、首先登录苹果开发者中心https://developer.apple.com/account/ 会出现下面飘红的提示&#xff0c;就是提示你要同意新协议。因为苹果规则的改变&#xff0c;需要先到appid管理中心加个联系手机…

Django REST FRAMEWORK swagger(一)框架详解

Django REST FRAMEWORK swagger&#xff08;一、框架详解&#xff09; 一.Django REST SWAGGER框架图 具体见下图 二.说明 RESTFul说明 每一个URI代表一种资源&#xff1b; 客户端和服务器之间&#xff0c;传递这种资源的某种表现层&#xff1b; 客户端通过四个HTTP动词&…

Prism for WPF初探(构建简单的模块化开发框架)

Prism for WPF初探&#xff08;构建简单的模块化开发框架&#xff09; 原文:Prism for WPF初探&#xff08;构建简单的模块化开发框架&#xff09;先简单的介绍一下Prism框架&#xff0c;引用微软官方的解释&#xff1a; Prism provides guidance to help you more easily desi…

15-[JavaScript]-ECMAScript 1

0.javaScript的发展历程 https://zhuanlan.zhihu.com/p/27985124 1、javaScript是什么&#xff1f; javaScript是一种web前端的描述语言&#xff0c;也是一种基于对象&#xff08;object&#xff09;和事件驱动&#xff08;Event Driven&#xff09;的、安全性好的脚本语言。 它…

WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)

WPF MVVM 架构 Step By Step(2)&#xff08;简单的三层架构示例及粘合代码GLUE code&#xff09; 原文:WPF MVVM 架构 Step By Step(2)&#xff08;简单的三层架构示例及粘合代码GLUE code&#xff09;我们第一步就是去了解三层架构和问题然后去看MVVM是怎么去解决这些问题的。…

基于YARN集群构建运行PySpark Application

文章转载&#xff1a;https://www.tuicool.com/articles/eaYVN3v Spark Application可以直接运行在YARN集群上&#xff0c;这种运行模式&#xff0c;会将资源的管理与协调统一交给YARN集群去处理&#xff0c;这样能够实现构建于YARN集群之上Application的多样性&#xff0c;比…

Apache nifi 集群安装

原文地址&#xff1a;https://pierrevillard.com/2016/08/13/apache-nifi-1-0-0-cluster-setup/ 文章写的很好了&#xff0c;步骤性的英文写得也比较易懂&#xff0c;原样搬过来了&#xff0c;没有再翻译 As you may know a version 1.0.0-BETA of Apache NiFi has been rele…

Html5 学习笔记 --》html基础 css 基础

HTML5 功能 HTML5特点 <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"utf-8"><title>基本格式</title> </head> <body><a href"http://www.baidu.com">百度</a> </b…