说明:

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

// 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

point-position2修改版相关推荐

  1. fc天使之翼2020修改版下载_海岛奇兵无限钻石修改版下载-海岛奇兵无限钻石修改版下载2020...

    海岛奇兵无限钻石修改版绝对是小伙伴们都在寻找的资源,修改众多资源,玩家可以解锁不同兵种建立更强大的部队啦!通过塔防与掠夺不断强化我方战力,合理运用策略至关重要,喜欢的朋友千万别错过! 修改无限钻石.金 ...

  2. 隐藏探针显示php版本号,修改版雅黑PHP探针 支持PHP7+(v0.4.7.2)

    雅黑 PHP 探针用于 Linux 系统(不推荐使用于 Windows 系统),每秒更新,不用刷网页.可以实时查看服务器硬盘资源.内存占用.网卡流量.系统负载.服务器时间等信息,1 秒钟刷新一次. 可 ...

  3. 【转】修改版WinXP集体歇业避免遭遇调查

    来自:新浪科技   立雄 20日,有消息披露番茄花园作者洪磊确认被拘的消息后,在业界引发了强烈的反响.22日凌晨,记者再次尝试登陆这些版本的官方下载网站时发现,他们已经集体歇业,或关闭提供软件下载的官 ...

  4. phpcms9.6 ueditor_PHPCMS V9.6.6 修改版

    本帖最后由 zhaoxunzhiyin 于 2020-12-12 18:14 编辑 PHPCMS V9.6.6 修改版官方改了后台界面,修复bug 安装文件不检查index.html 安装完删除安装目 ...

  5. 列字段通用excel导入修改版

    最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--列字段 入导Excel对网上通用excel入导修改版:处理Excel中单元格为数字问题.可以连续取读多个sheet 每日一道理 书,各种 ...

  6. 官方原版美化修改版完美适配双端海洋cms模板

    简介: 官方原版美化修改版海洋cms模板,官方V10.7版本自带原模板,已测试,完美无错,自适应手机端. 美化修改了:1.导航为一行,2.首页添加幻灯片效果,3.播放页修改为完整显示,不会因为页面的滑 ...

  7. Gentoo Framebuffer, Bootsplash Grubsplash 指南(修改版)

    Gentoo Framebuffer, Bootsplash & Grubsplash 指南(修改版) Gentoo Framebuffer, Bootsplash & Grubspl ...

  8. ACCESS数据库C#操作类(SQLHELPER修改版)——转自网上

    ACCESS数据库C#操作类(SQLHELPER修改版) 这个是针对ACCESS数据库操作的类,同样也是从SQLHELPER提取而来,分页程序的调用可以参考MSSQL那个类的调用,差不多的,只是提取所 ...

  9. Android 仿美团网,大众点评购买框悬浮效果之修改版

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17761431),请尊重他人的辛勤劳动成果,谢谢! 我之前写 ...

  10. 黄聪:WordPress图片插件:Auto Highslide修改版(转)

    一直以来很多人都很喜欢我博客使用的图片插件,因为我用的跟原版是有些不同的,效果比原版的要好,他有白色遮罩层,可以直观的知道上下翻图片和幻灯片放映模式.很多人使用原版之后发现我用的更加帅一些,于是很多人 ...

最新文章

  1. BeautifulSoup库的使用
  2. 数据库复习总结(12)数据检索
  3. 对于如何删除redis中geo存入的坐标
  4. boost::endian模块实现算术缓冲区的测试程序
  5. .htaccess FollowSymlinks影响rewrite功能
  6. java 组合代码_java实现Composite组合模式的实例代码
  7. 用Java测试多线程代码
  8. arcgis已试图对空几何执行该操作_ArcGIS中地理配准与空间校正的不同
  9. edge浏览器如何把网页放到桌面_电脑如何添加便签,便签怎么放到桌面上
  10. 苹果CEO库克薪酬达员工1500倍;曝英特尔将开放x86内核授权;TensorFlow技术主管皮特・沃登离职|极客头条
  11. Centos 设置时区和时间以及增加中文输入法
  12. 黑马程序员全套Java教程_Java基础入门视频教程零基础自学Java必备教程视频讲义(2)
  13. Oracle数据库的基本语句(最新)
  14. word插入漂亮的代码块
  15. phpMyAdmin安装配置教程
  16. 锋迷商城spring-vue项目流程和笔记
  17. Unity制作AR图片和视频展示
  18. 微信小程序创建订单号思路(附将带其它符号字符串转换成纯数字字符串)
  19. 不会编程,别着急!免编程工具助你快速开发App
  20. 《深入浅出WPF》系列视频(特辑)——MVVM入门与提高(难度300+)

热门文章

  1. Spring Cloud —— 负载均衡与 Ribbon 应用
  2. IDEA——Maven的配置与使用
  3. Spring Boot —— YAML配置文件
  4. mac地址转换_mac电脑格式转化工具
  5. php 编译原理,编译原理
  6. mysql+distinct+max_MySQL中distinct与group by之间的性能进行比较
  7. ROS底盘控制节点 源码分析
  8. (并查集)小希的迷宫
  9. 计算机科学陈国华,科学网—模式识别与智能系统是个什么专业? - 晏燕华的博文...
  10. c向文件中插入数据_如何把数据写入顺序文件中,VBA代码中Write#语句的利用