[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;  
}

目录
相关文章
|
5天前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
22 4
|
5月前
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
59 0
|
7月前
|
安全 编译器 C++
C++一分钟之-编译时计算:constexpr与模板元编程
【6月更文挑战第28天】在C++中,`constexpr`和模板元编程用于编译时计算,提升性能和类型安全。`constexpr`指示编译器在编译时计算函数或对象,而模板元编程通过模板生成类型依赖代码。常见问题包括误解constexpr函数限制和模板递归深度。解决策略包括理解规则、编写清晰代码、测试验证和适度使用。通过实战示例展示了如何使用`constexpr`计算阶乘和模板元编程计算平方。
108 13
|
7月前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
103 1
|
3月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
790 3
|
4月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
73 11
|
4月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
40 3
|
5月前
|
C++
C++ PCL 计算多个RT矩阵变换后的变换矩阵
C++ PCL 计算多个RT矩阵变换后的变换矩阵
63 0
|
5月前
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
123 0
|
6月前
|
机器学习/深度学习 算法 C++
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)