uj5u.com熱心網友回復:
百度搜相關關鍵字。uj5u.com熱心網友回復:
分別計算S和T里任意兩點的距離,并判斷是否相等(誤差小于delta)uj5u.com熱心網友回復:
#include <opencv2\opencv.hpp>#include <cmath>
#include <cv.h>
#include <fstream>
#include <iostream>
#include <vector>
//#include "Windef.h"
#include "opencv2/calib3d/calib3d.hpp"
#include <algorithm>
//#include "opencv2/imgcodecs.hpp"
using namespace std;
using namespace cv;
//bool cmp(int *p, int *q)
//{
// if (p[0] == q[0])
// {
// if (p[1] == q[1])
// {
// return p[2]<q[2];
// }
// else return p[1]<q[1];
// }
// else return p[0]<q[0];
//}
int findMax(vector<double> vec) {
int max = -999;
for (auto v : vec) {
if (max < v) max = v;
}
return max;
}
int main(){
// 匯入三維資料
vector<cv::Point2d> points1, points2;
ifstream infile("pl.txt");
if (!infile) { cout << "LinePoint-L6.txt! " << endl; return 0; }
double x, y;
while (infile >> x >> y)
{
points1.push_back(cv::Point2d(x, y));
}
ifstream infile1("pr.txt");
if (!infile1) { cout << "LinePoint-R6.txt! " << endl; return 0; }
double x1, y1;
while (infile1 >> x1 >> y1)
{
points2.push_back(cv::Point2d(x1, y1));
}
//3D匹配
vector<double> dis_3dv; //points11中點的距離
vector<double> dis1_3dv;//points21中點的距離
double **dis_3d = new double*[13];
double **dis1_3d = new double*[13];
//double dis_3d[13][13];
//double dis1_3d[13][13];
for (int i = 0; i < points1.size(); i++)
{
double a = points1[i].x;
double b = points1[i].y;
//double c = points11[i].z;
double a1 = points2[i].x;
double b1 = points2[i].y;
//double c1 = points21[i].z;
dis_3d[i] = new double[13];
dis1_3d[i] = new double[13];
for (int j = 0; j < points2.size() && j != i; j++)
{
//點的坐標
double x = points1[j].x;
double y = points1[j].y;
//double z = points11[j].z;
double x1 = points2[j].x;
double y1 = points2[j].y;
//double z1 = points21[j].z;
//計算點到點的距離
//dis_3d.push_back(sqrt((a - x)*(a - x) + (b - y)*(b - y)));
//dis1_3d.push_back(sqrt((a1 - x1)*(a1 - x1) + (b1 - y1)*(b1 - y1) ));
dis_3d[i][j] = sqrt((a - x)*(a - x) + (b - y)*(b - y));
dis1_3d[i][j] = sqrt((a1 - x1)*(a1 - x1) + (b1 - y1)*(b1 - y1));
//dis1_3d[i][j] = sqrt((a1 - x1)*(a1 - x1) + (b1 - y1)*(b1 - y1));
//cout << dis_3d[2][12] << endl << dis_3d[2][12] << endl;
//dis_3d.push_back(sqrt((a-x)*(a-x) + (b-y)*(b-y)+(c-z)*(c-z)));
sort(dis_3d, dis_3d + 13);
sort(dis1_3d, dis1_3d + 13);
cout << dis_3d[i][j] <<endl;
}
}
//cout << aa[0][0]<< endl;
//vector轉陣列
vector<int> Match; //存盤匹配
//double dis[15][15];
for (int m = 0; m < points1.size(); m++){
for (int i = 0; i < points1.size(); i++){
vector<double> dis;//存盤兩個不同的點集之間距離的差值
for (int j = 0; j < points2.size(); j++){
//計算點集之間距離的差值
//sort(dis_3d[i][j], dis_3d[i][j] + 15);
dis.push_back(fabs(dis_3d[m][j] - dis1_3d[i][j]));
//cout << dis[m];
}
//匹配點的存盤
double maxNumber = findMax(dis);
cout << maxNumber << endl;
double threshold = -22;
if (maxNumber < threshold)
{
//求出此時對應的最小距離所在位置
Match.push_back(i);
}
}
//Match1.push_back(Point(m, Match[i]));
}
cout << Match[7] << endl;
system("pause");
}
請問我的程式思路哪里不對嗎
uj5u.com熱心網友回復:
1,回圈不需要都從0開始,不同點才需要計算距離for (int m = 0; m < points1.size(); m++){
for (int i = m+1 ; i < points1.size(); i++)
2、應該不需要保存距離值
if(d1-d2>delta)
return false;//d1,d2分別 為S、T集合的i、j點之間的距離差值,發現有距離不匹配就回傳,不需要繼續往下計算
uj5u.com熱心網友回復:
您好 方便留一下行內系方式嗎 我請教您一下 多謝啦轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/69972.html
標籤:基礎類
