[C++&OpenCv] 两点距离、三点角度的计算

简介: [C++&OpenCv] 两点距离、三点角度的计算


#include <opencv/cv.h>  
#include <opencv/highgui.h>  
#include <stdio.h>  
//#include <atlstr.h>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>  //opencv申明
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2/opencv.hpp>
#include < iostream>
#include <stdio.h>
#include "cstring"
using namespace cv;
using namespace std;
vector<Point> points;
IplImage* src = 0;   
IplImage* dst = 0; 
int i = 0 ,j=0;
//两点间距离公式
float getDistance(CvPoint pointO, CvPoint pointA)
{
    float distance;
    distance = powf((pointO.x - pointA.x), 2) + powf((pointO.y - pointA.y), 2);
    distance = sqrtf(distance);
  //屏幕分辨率为1366*768,一个像素约为0.214mm,所以这里乘以0.214转化为实际尺寸,当然分辨率不同,一个像素表示的实际长度也不同
    return distance;
}
//两条直线间的夹角
float angle(Point pt1, Point pt0, Point pt2)
{
double dx1 = (pt1.x - pt0.x);
double dy1 = (pt1.y - pt0.y);
double dx2 = (pt2.x - pt0.x);
double dy2 = (pt2.y - pt0.y);
double angle_line = (dx1*dx2 + dy1 * dy2) / sqrt((dx1*dx1 + dy1 * dy1)*(dx2*dx2 + dy2 * dy2) + 1e-10);
double a = acos(angle_line) * 180 / 3.141592653;
return a;
}
void on_mouse( int event, int x, int y, int flags, void* ustc)  
{  
  static CvPoint pre_pt = (-1,-1);  
  static CvPoint cur_pt = (-1,-1);  
  CvFont font;  
  cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);  
  char temp[16];  
  if( event == CV_EVENT_LBUTTONDOWN )  
  {  
      cvCopy(dst,src);  
      sprintf(temp,"(%d,%d)",x,y);  
      pre_pt = cvPoint(x,y);  
    points.push_back(pre_pt);
      //cvPutText(src,temp, pre_pt, &font, cvScalar(0,0,255));  
      cvCircle( src, pre_pt,3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 ); 
    int k = points.size();
    if(k>1)
    {
    cvLine(src,points.at(i),points.at(i+1),cvScalar(0,255,60),1,8,0);
    float Dis = getDistance(points.at(i),points.at(i+1));
    //转换字节数组到float数据    
    char m_Dis[50]; 
    sprintf(m_Dis,"%.2f",Dis);//如果用sprintf函数小数点后会有6位
    cvPutText(src,m_Dis,(points.at(i)+points.at(i+1))/2, &font, cvScalar(0,0,255)); 
    i++;
    }
    if(k>2)
    {
     float  m_angle = angle(points.at(j), points.at(j+1), points.at(j+2));
     char m_angle1[50]; 
     sprintf(m_angle1,"%.2f",m_angle);//如果用sprintf函数小数点后会有6位
     //将角度保留两位小数
    // double aaa = floor(m_angle * 100.000f + 0.5) / 100.000f;
     cvPutText(src,m_angle1,points.at(j+1), &font, cvScalar(255,0,255));
     j++;
    }
      cvShowImage( "src", src );  
      cvCopy(src,dst);  
  }  
  else if( event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))  
  {  
      cvCopy(dst,src);  
      sprintf(temp,"(%d,%d)",x,y);  
      cur_pt = cvPoint(x,y);        
      cvPutText(src,temp, cur_pt, &font, cvScalar(255,0,255));  
      cvShowImage( "src", src );  
  }  
}  
int main()  
{  
  src=cvLoadImage("D:\\Data\\1.jpg",1);  
  dst=cvCloneImage(src);  
  cvNamedWindow("src",1);  
  cvSetMouseCallback( "src", on_mouse, 0 );    
  cvShowImage("src",src);  
  cvWaitKey(0);   
  cvDestroyAllWindows();  
  cvReleaseImage(&src);  
  cvReleaseImage(&dst);  
  return 0;  
}

目录
相关文章
|
2月前
|
存储 并行计算 前端开发
【C++ 函数 基础教程 第五篇】C++深度解析:函数包裹与异步计算的艺术(二)
【C++ 函数 基础教程 第五篇】C++深度解析:函数包裹与异步计算的艺术
39 1
|
2月前
|
数据安全/隐私保护 C++ 容器
【C++ 函数 基础教程 第五篇】C++深度解析:函数包裹与异步计算的艺术(一)
【C++ 函数 基础教程 第五篇】C++深度解析:函数包裹与异步计算的艺术
49 0
|
21天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
43 6
|
2月前
|
存储 资源调度 算法
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
|
16天前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(上) |类的作用域、类的实例化、类的对象大小的计算、类成员函数的this指针
【C++成长记】C++入门 | 类和对象(上) |类的作用域、类的实例化、类的对象大小的计算、类成员函数的this指针
|
24天前
|
人工智能 机器人 Linux
【C++】Linux下如何查看opencv的版本
【C++】Linux下如何查看opencv的版本
|
2月前
|
存储 算法 编译器
【C++ 泛型编程 进阶篇】C++模板元编程深度解析:探索编译时计算的神奇之旅
【C++ 泛型编程 进阶篇】C++模板元编程深度解析:探索编译时计算的神奇之旅
103 0
|
2月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
|
2月前
|
算法 计算机视觉 C++
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
|
2月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Canny边缘检测算法
Opencv(C++)学习系列---Canny边缘检测算法