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

6 篇文章 9 订阅
#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
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现效果:http://v.youku.com/v_show/id_XMTU2Mzk0NjU3Ng==.html 如何在你的电脑上运行这个程序? 1,它需要cvblobslib这一个opencv的扩展库来实现检测物体与给物体画框的功能,具体安装信息请见: http://dsynflo.blogspot.com/2010/02/cvblobskib-with-opencv-installation.html,当你配置好cvblobslib之后,你可以用这一的程序进行测试:http://dl.dropbox.com/u/110310945/Blobs%20test.rar 2,视频中两个摄像头之间距离是6cm,你可以根据你摄像头的型号,来选择合适的距离来达到最好的效果。 3,在进行测距之前,首先需要对摄像头进行标定,那么如何标定呢? 在stdafx.h中把"#define CALIBRATION 0"改成 “#define CALIBRATION 1”表示进行标定,标定之后,你就可以在工程目录下的"CalibFile" 文件夹中得到标定信息的文件。如果标定效果还不错,你就可以吧"#define CALIBRATION " 改成0,以后就不需要再标定,直接使用上一次的标定信息。你还需要把"#define ANALYSIS_MODE 1"这行代码放到stdafx.h中。 4,视频中使用的是10*7的棋牌格,共摄录40帧来计算摄像头的各种参数,如果你像使用其他棋盘格,可以在 "StereoFunctions.cpp"文件中修改相应参数。 5,如果你无法打开摄像头,可以在 "StereoGrabber.cpp"文件中修改代码“cvCaptureFromCAM(index)”中index的值。 6,About computing distance: it interpolates the relationship between depth-value and real-distance to third degree polynomial. So i used excel file "interpolation" for interpolation to find k1 to k4, you should find your own value of these parameters. 7,你可以通过调整控制窗口中各个参数的滑块,从而来得到更好的视差图。 8,在目录下的”distance“文件夹中,有计算距离信息的matlab代码。 9,如果你想了解基本的理论,可以看一下这个文档:http://scholar.lib.vt.edu/theses/available/etd-12232009-222118/unrestricted/Short_NJ_T_2009.pdf 视频中环境:vs2008,opencv2.1

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶布布

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值