精华内容
下载资源
问答
  • 这是根据每周一练的第一周题目要求做的。先检测出两平行直线,再计算出其距离
  • 【opencv】平行线之间距离

    万次阅读 2014-03-10 23:05:42
    问题:一张输入图片如下,有平行线,求出平行线之间距离 解决思路: 1. 对图像中的直线进行细化 2. 提取直线的轮廓坐标 3. 对轮廓上的坐标进行直线集合,从而得到直线方程 4. 计算条直线之间距离 ...

    问题:一张输入图片,图片上有两条平行线,求出这两条平行线之间的距离

    解决思路:

    1. 对图像中的直线进行细化

    2. 提取直线的轮廓坐标

    3. 对轮廓上的坐标进行直线集合,从而得到直线方程

    4. 计算两条直线之间的距离

    参考:

    问题来源 http://www.opencvchina.com/thread-854-1-1.html

    图像细化 http://blog.csdn.net/qianchenglenger/article/details/19332011

    图像轮廓提取 http://blog.csdn.net/augusdi/article/details/9000893

    直线拟合 http://blog.csdn.net/zhuoyue08/article/details/6803040

    两条直线之间的距离公式3:http://zhidao.baidu.com/link?url=ef_DHNkjyq1qq7VgubX3afL2KIUQIB4ukd3zHGp0zz8iPPKC046azyvG5ltHR-i0WaLI72eO7j0sOJI4wZSE4q

    工具:

     opencv 2.4.8 + VS2013

    代码:

    1.头文件 ProcessImage.h

    //ProcessImage.h
    #pragma once
    #include <opencv2/highgui/highgui.hpp>
    
    /* 对输入图像进行细化
     * src为输入图像,用cvThreshold函数处理过的8位灰度图像格式,元素中只有0与1,1代表有元素,0代表为空白
     * dst为对src细化后的输出图像,格式与src格式相同,调用前需要分配空间,元素中只有0与1,1代表有元素,0代表为空白
     * maxIterations限制迭代次数,如果不进行限制,默认为-1,代表不限制迭代次数,直到获得最终结果
     */
    void thinImage(IplImage* src, IplImage* dst, int maxIterations = -1);
    

    2.代码实现 ProcessImage.cpp

    //ProcessImage.cpp
    #include "ProcessImage.h"
    #include <utility>
    #include <vector>
    void thinImage(IplImage* src, IplImage* dst, int maxIterations)
    {
    	using namespace cv;
    	CvSize size = cvGetSize(src);
    	cvCopy(src, dst);//将src中的内容拷贝到dst中  
    	int count = 0;  //记录迭代次数  
    	while (true)
    	{
    		count++;
    		if (maxIterations != -1 && count > maxIterations) //限制次数并且迭代次数到达  
    			break;
    		//std::cout << count << ' ';输出迭代次数  
    		std::vector<std::pair<int, int> > mFlag; //用于标记需要删除的点  
    		//对点标记  
    		for (int i = 0; i<size.height; ++i)
    		{
    			for (int j = 0; j<size.width; ++j)
    			{
    				//如果满足四个条件,进行标记  
    				//  p9 p2 p3  
    				//  p8 p1 p4  
    				//  p7 p6 p5  
    				int p1 = CV_IMAGE_ELEM(dst, uchar, i, j);
    				int p2 = (i == 0) ? 0 : CV_IMAGE_ELEM(dst, uchar, i - 1, j);
    				int p3 = (i == 0 || j == size.width - 1) ? 0 : CV_IMAGE_ELEM(dst, uchar, i - 1, j + 1);
    				int p4 = (j == size.width - 1) ? 0 : CV_IMAGE_ELEM(dst, uchar, i, j + 1);
    				int p5 = (i == size.height - 1 || j == size.width - 1) ? 0 : CV_IMAGE_ELEM(dst, uchar, i + 1, j + 1);
    				int p6 = (i == size.height - 1) ? 0 : CV_IMAGE_ELEM(dst, uchar, i + 1, j);
    				int p7 = (i == size.height - 1 || j == 0) ? 0 : CV_IMAGE_ELEM(dst, uchar, i + 1, j - 1);
    				int p8 = (j == 0) ? 0 : CV_IMAGE_ELEM(dst, uchar, i, j - 1);
    				int p9 = (i == 0 || j == 0) ? 0 : CV_IMAGE_ELEM(dst, uchar, i - 1, j - 1);
    
    				if ((p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) >= 2 && (p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) <= 6)
    				{
    					int ap = 0;
    					if (p2 == 0 && p3 == 1) ++ap;
    					if (p3 == 0 && p4 == 1) ++ap;
    					if (p4 == 0 && p5 == 1) ++ap;
    					if (p5 == 0 && p6 == 1) ++ap;
    					if (p6 == 0 && p7 == 1) ++ap;
    					if (p7 == 0 && p8 == 1) ++ap;
    					if (p8 == 0 && p9 == 1) ++ap;
    					if (p9 == 0 && p2 == 1) ++ap;
    
    					if (ap == 1)
    					{
    						if (p2*p4*p6 == 0)
    						{
    							if (p4*p6*p8 == 0)
    							{
    								//标记  
    								mFlag.push_back(std::make_pair(i, j));
    							}
    						}
    					}
    				}
    			}
    		}
    
    		//将标记的点删除  
    		for (std::vector<std::pair<int, int> >::iterator i = mFlag.begin(); i != mFlag.end(); ++i)
    		{
    			CV_IMAGE_ELEM(dst, uchar, i->first, i->second) = 0;
    		}
    
    		//直到没有点满足,算法结束  
    		if (mFlag.size() == 0)
    		{
    			break;
    		}
    		else
    		{
    			mFlag.clear();//将mFlag清空  
    		}
    
    		//对点标记  
    		for (int i = 0; i<size.height; ++i)
    		{
    			for (int j = 0; j<size.width; ++j)
    			{
    				//如果满足四个条件,进行标记  
    				//  p9 p2 p3  
    				//  p8 p1 p4  
    				//  p7 p6 p5  
    				int p1 = CV_IMAGE_ELEM(dst, uchar, i, j);
    				if (p1 != 1) continue;
    				int p2 = (i == 0) ? 0 : CV_IMAGE_ELEM(dst, uchar, i - 1, j);
    				int p3 = (i == 0 || j == size.width - 1) ? 0 : CV_IMAGE_ELEM(dst, uchar, i - 1, j + 1);
    				int p4 = (j == size.width - 1) ? 0 : CV_IMAGE_ELEM(dst, uchar, i, j + 1);
    				int p5 = (i == size.height - 1 || j == size.width - 1) ? 0 : CV_IMAGE_ELEM(dst, uchar, i + 1, j + 1);
    				int p6 = (i == size.height - 1) ? 0 : CV_IMAGE_ELEM(dst, uchar, i + 1, j);
    				int p7 = (i == size.height - 1 || j == 0) ? 0 : CV_IMAGE_ELEM(dst, uchar, i + 1, j - 1);
    				int p8 = (j == 0) ? 0 : CV_IMAGE_ELEM(dst, uchar, i, j - 1);
    				int p9 = (i == 0 || j == 0) ? 0 : CV_IMAGE_ELEM(dst, uchar, i - 1, j - 1);
    
    				if ((p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) >= 2 && (p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) <= 6)
    				{
    					int ap = 0;
    					if (p2 == 0 && p3 == 1) ++ap;
    					if (p3 == 0 && p4 == 1) ++ap;
    					if (p4 == 0 && p5 == 1) ++ap;
    					if (p5 == 0 && p6 == 1) ++ap;
    					if (p6 == 0 && p7 == 1) ++ap;
    					if (p7 == 0 && p8 == 1) ++ap;
    					if (p8 == 0 && p9 == 1) ++ap;
    					if (p9 == 0 && p2 == 1) ++ap;
    
    					if (ap == 1)
    					{
    						if (p2*p4*p8 == 0)
    						{
    							if (p2*p6*p8 == 0)
    							{
    								//标记  
    								mFlag.push_back(std::make_pair(i, j));
    							}
    						}
    					}
    				}
    			}
    		}
    		//删除  
    		for (std::vector<std::pair<int, int> >::iterator i = mFlag.begin(); i != mFlag.end(); ++i)
    		{
    			CV_IMAGE_ELEM(dst, uchar, i->first, i->second) = 0;
    		}
    
    		//直到没有点满足,算法结束  
    		if (mFlag.size() == 0)
    		{
    			break;
    		}
    		else
    		{
    			mFlag.clear();//将mFlag清空  
    		}
    	}
    }
    
    3.主函数所在文件 Source.cpp

    //Source.cpp
    #include "ProcessImage.h"
    #include <iostream>
    #include <opencv2/opencv.hpp>
    #define _TEST
    using namespace cv;
    int main(int argc, char * argv[])
    {
    	//判断输入是否满足要求
    	if (argc != 2)
    	{
    		std::cout << "argument error!";
    		return -1;
    	}
    	IplImage *pSrc = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
    	if (!pSrc)
    	{
    		std::cout << "read file failed!";
    		return -1;
    	}
    
    	//显示原图
    	namedWindow("原图", CV_WINDOW_AUTOSIZE);
    	cvShowImage("原图", pSrc);
    
    	IplImage *pTemp = cvCreateImage(cvGetSize(pSrc), pSrc->depth, pSrc->nChannels);
    	IplImage *pDst = cvCreateImage(cvGetSize(pSrc), pSrc->depth, pSrc->nChannels);
    
    	//将原图像转换为二值图像
    	cvThreshold(pSrc, pTemp, 128, 1, CV_THRESH_BINARY_INV);
    	//细化
    	thinImage(pTemp, pDst);
    
    #ifdef _TEST
    	//显示细化后的图像
    	IplImage *pThinImage = cvCreateImage(cvGetSize(pSrc), pSrc->depth, pSrc->nChannels);
    	cvCopy(pDst, pThinImage);
    	cvThreshold(pThinImage, pThinImage, 0.5, 255,CV_THRESH_BINARY);
    	namedWindow("1 图像细化的结果", CV_WINDOW_AUTOSIZE);
    	cvShowImage("1 图像细化的结果", pThinImage);
    	cvReleaseImage(&pThinImage);
    #endif
    
    	//求轮廓
    	CvMemStorage* storage = cvCreateMemStorage(0);
    	CvSeq* contours = 0;
    	cvFindContours(pDst	, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0, 0));
    
    #ifdef _TEST
    	//将轮廓画出来
    	IplImage *pDrawing1 = cvCreateImage(cvGetSize(pSrc),8,3);
    	cvZero(pDrawing1);
    	cvDrawContours(pDrawing1, contours, Scalar(255, 0, 0), Scalar(0, 0, 255), 1, 2, 8, cvPoint(0, 0));
    	namedWindow("2 求轮廓", CV_WINDOW_AUTOSIZE);
    	cvShowImage("2 求轮廓", pDrawing1);
    	cvReleaseImage(&pDrawing1);
    #endif
    
    
    	//轮廓已经寻找到,均在contours中存放,我们需要对轮廓进行拟合
    	//FitLine函数的用法:
    	// 二维空间点拟合时 是 float[4]
    	// 三位空间点拟合时 是 float[6]	
    	float *line1 = new float[4];
    	float *line2 = new float[4];
    	// 第一个参数: 存储点序列
    	// 第二个参数: 拟合算法,其中 CV_DIST_L2 就是平常的最小二乘法
    	// 第三,第四,第五参数推荐值是 0,   0.01,  0.01,
    	// 第六参数: line中存储返回值
    	// 二维空间时: line[0--3] 分别为 (vx, vy, x0, y0)
    	//      其中 vx, vy 是正规化之后的斜率向量。 x0,y0 是直线经过的点。
    	// 三维空间时: line[0--5]  分别是 (vx, vy, vz, x0, y0, z0) 。意义同上
    	cvFitLine(contours, CV_DIST_L2, 0, 0.01, 0.01, line1);
    	cvFitLine(contours->h_next, CV_DIST_L2, 0, 0.01, 0.01, line2);
    	
    	//输出四个点
    	std::cout << "第一条线: " << line1[0] << " " << line1[1] << " " << line1[2] << " " << line1[3] << std::endl;
    	std::cout << "第二条线: " << line2[0] << " " << line2[1] << " " << line2[2] << " " << line2[3] << std::endl;
    	
    #ifdef _TEST
    	//根据直线方程公式,我们从直线上取点,并画出来
    	IplImage *pDrawing2 = cvCreateImage(cvGetSize(pSrc), 8, 3);
    	cvZero(pDrawing2);
    	cvLine(pDrawing2, cvPoint(0, (int)(line1[3] - line1[1] / line1[0] * line1[2])),
    		cvPoint(pDrawing2->width - 1, (int)((pDrawing2->width - 1 - line1[2])*line1[1] / line1[0] + line1[3])),
    		cvScalar(255, 0, 0));
    	cvLine(pDrawing2, cvPoint(0, (int)(line2[3] - line2[1] / line2[0] * line2[2])), 
    		cvPoint(pDrawing2->width - 1, (int)((pDrawing2->width - 1 - line2[2])*line2[1] / line2[0] + line2[3])), 
    		cvScalar(0, 0, 255));
    	namedWindow("3 直线拟合", CV_WINDOW_AUTOSIZE);
    	cvShowImage("3 直线拟合", pDrawing2);
    	cvReleaseImage(&pDrawing2);
    #endif
    
    	//我们根据距离方程,求出两条直线的距离
    	double distance = abs(line1[0] * (line2[3]-line1[3]) - line1[1] * (line2[2]-line1[2]));	//注意,vx,vy已经正规化了
    	std::cout << "两条直线之间的距离为: " << distance << std::endl;
    	delete[] line1;
    	delete[] line2;
    
    	cvReleaseMemStorage(&storage);
    	cvReleaseImage(&pSrc);
    	cvReleaseImage(&pTemp);
    	cvReleaseImage(&pDst);
    
    	waitKey(0);
    
    	return 0;
    }
    运行效果:

    输入:

    输出:


    展开全文
  • // 得到直线的tan斜率 double GetTanOfLine( LINE line ) { double x_dis = line.pt0.x - line.pt1.x; if ( x_dis == 0.0 ) return 10e9; return (line.pt0.y - line.pt1.y) / x_...// 得到平行线之间距离 dou
    struct LINE
    {
    	CvPoint pt0;
    	CvPoint pt1;
    	LINE( CvPoint pta, CvPoint ptb )
    	{
    		pt0 = pta;
    		pt1 = ptb;
    	}
    	LINE()
    	{
    		pt0.x = pt0.y = 0;
    		pt1.x = pt1.y = 0;
    	}
    };
    
    // 得到直线的tan斜率
    double GetTanOfLine( LINE line )
    {
    	double x_dis = line.pt0.x - line.pt1.x;
    	if ( x_dis == 0.0 ) return 10e9;
    	return (line.pt0.y - line.pt1.y) / x_dis;
    }
    
    
    // 得到两条平行线之间的距离
    double GetDisOfParallelLines( LINE line0, LINE line1 )
    {
    	CvPoint midPoint = cvPoint( (line0.pt0.x + line0.pt1.x)/2, (line0.pt0.y + line0.pt1.y)/2 ); // 中点
    	double x_dis = line1.pt0.x - line1.pt1.x;
    	if ( x_dis == 0.0 ) return fabs((double)(midPoint.x - line0.pt0.x)); // 如果line1 垂直x轴
    
    	double a = (line1.pt0.y - line1.pt1.y) / x_dis;
    	double b = line1.pt0.y - (line1.pt0.x * a);
    	return fabs(a * midPoint.x - midPoint.y + b) / sqrt(a * a + 1);
    }
    
    
    // 判断两直线是否平行
    bool IsParallelLines( LINE line0, LINE line1 )
    {
    #define LIMIT (1.1547 / 3) #近似平行线的斜率之差的范围
    
    	double angleTan0 = GetTanOfLine( line0 );
    	double angleTan1 = GetTanOfLine( line1 );
    	if ( fabs(angleTan0 - angleTan1) < (double)LIMIT )
    	{
    		return 1;
    	}
    	return 0;
    }
    

    展开全文
  • OpenCV计算平行线之间距离

    千次阅读 2019-04-23 08:25:48
    //第四部 计算条直线之间距离 公式是: |b1-b0| / sqrt(A*A + B*B) float dis = abs(b[1]-b[0])/sqrt(A*A + B*B); printf("dis is %f \n" , dis); // 释放内存 cvReleaseImage(&pSrc); ...

    代码来自www.opencvchina.com

    #include "cv.h"
    #include "highgui.h"
    #include "cxcore.h"
    #include <stdlib.h>
    #include <stdio.h>
    
    #ifndef LINESDISHEADER
    
    #define LINESDISHEADER
    
    //对输入图像进行细化
    void ThinImage(IplImage* src, IplImage* dst, int iterations=1);
    
    //获取图像上的轮廓 坐标 
    void GetContoursPoints(IplImage* src , CvMat** LinePoints);
    
    #endif
    
    
    
    
    #include "LinesDis.h"
    
    
    //对输入图像进行细化
    void ThinImage(IplImage* src, IplImage* dst, int iterations)
    {
     CvSize size = cvGetSize(src);
    
     cvCopy(src, dst);//拷贝一个数组给另一个数组
        int n = 0,i = 0,j = 0;
     for(n=0; n<iterations; n++)
     {
    IplImage* t_image;
     
     t_image = cvCloneImage(dst);
      for(i=0; i<size.height;  i++)
      {
       for(int j=0; j<size.width; j++)
       {
        if(CV_IMAGE_ELEM(t_image,byte,i,j)==1)
        {
         int ap=0;
         int p2 = (i==0)?0:CV_IMAGE_ELEM(t_image,byte, i-1, j);
         int p3 = (i==0 || j==size.width-1)?0:CV_IMAGE_ELEM(t_image,byte, i-1, j+1);
         if (p2==0 && p3==1)
         {
          ap++;
         }
         int p4 = (j==size.width-1)?0:CV_IMAGE_ELEM(t_image,byte,i,j+1);
         if(p3==0 && p4==1)
         {
          ap++;
         }
         int p5 = (i==size.height-1 || j==size.width-1)?0:CV_IMAGE_ELEM(t_image,byte,i+1,j+1);
         if(p4==0 && p5==1)
         {
          ap++;
         }
         int p6 = (i==size.height-1)?0:CV_IMAGE_ELEM(t_image,byte,i+1,j);
         if(p5==0 && p6==1)
         {
          ap++;
         }
         int p7 = (i==size.height-1 || j==0)?0:CV_IMAGE_ELEM(t_image,byte,i+1,j-1);
         if(p6==0 && p7==1)
         {
          ap++;
         }
         int p8 = (j==0)?0:CV_IMAGE_ELEM(t_image,byte,i,j-1);
         if(p7==0 && p8==1)
         {
          ap++;
         }
         int p9 = (i==0 || j==0)?0:CV_IMAGE_ELEM(t_image,byte,i-1,j-1);
         if(p8==0 && p9==1)
         {
          ap++;
         }
         if(p9==0 && p2==1)
         {
          ap++;
         }
         if((p2+p3+p4+p5+p6+p7+p8+p9)>1 && (p2+p3+p4+p5+p6+p7+p8+p9)<7)
         {
          if(ap==1)
          {
           if(p2*p4*p8==0)
           {
            if(p2*p6*p8==0)
            {
             CV_IMAGE_ELEM(dst, byte,i,j)=0;
            }
           }
          }
         }                    
        }
    
       }
    
      }            
      cvReleaseImage(&t_image);
    
    }
    
     //将二值图像转换成灰度,以便显示
      i = 0;j = 0;
      size = cvGetSize(dst);
     for(i=0; i<size.height;  i++)
     {
      for(j=0; j<size.width; j++)
      {
       if(CV_IMAGE_ELEM(dst,uchar,i,j)==1)
       {
        CV_IMAGE_ELEM(dst,uchar,i,j) = 255;
       }
       else
       {
        CV_IMAGE_ELEM(dst,uchar,i,j) = 0;
       }
      }
     }
    
    }
    
    //获取图像上的轮廓 坐标 
    void GetContoursPoints(IplImage* src , CvMat** LinePoints)
    {
    	CvMemStorage* storage = cvCreateMemStorage(0);
    	CvSeq* contour = 0;
    	IplImage* binary_image = cvCreateImage(cvGetSize(src),8,1);
    	cvCopy(src,binary_image);
    
    	cvFindContours(binary_image , storage , &contour , sizeof(CvContour) , CV_RETR_CCOMP,CV_CHAIN_APPROX_NONE,cvPoint(0,0) );
    
    //#define SHOWCON
    #ifdef SHOWCON
    	IplImage* contours;
    	contours = cvCreateImage(cvGetSize(src),8,1);
    	cvZero(contours);
    	cvNamedWindow("con");
    #endif 
    
    	int LinesCount = 0;
    
    	for(;contour!=0 ; contour=contour->h_next)
    	{
    		if(contour->total < 20 )continue;
    
    		LinePoints[LinesCount] = cvCreateMat(contour->total/8,1,CV_32FC2);
    		
    	
    		for(int i=0; i<contour->total/8 ; i++)
    		{
    	
    			CvPoint * pt = (CvPoint*)cvGetSeqElem(contour, i); // 读出第i个点。
    			cvSet2D(LinePoints[LinesCount] , i,0,cvScalar(pt->x,src->height - pt->y,0,0));
    
    			//cvSetReal2D(contours , pt->y , pt->x , 255.0);
    #ifdef SHOWCON
    			CvScalar val = cvGet2D(LinePoints[LinesCount] , i, 0);
    			cvSetReal2D(contours , val.val[1] ,val.val[0],255);
    		
    			cvShowImage("con" ,contours);
    			cvWaitKey(0);
    #endif
    
    		
    		}
    		LinesCount++;
    
    	}
    
    #ifdef SHOWCON
    	for(int i=0;i<LinesCount;i++)
    	{
    		for(int y=0;y<LinePoints[i]->rows;y++)
    		{
    			CvScalar pt = cvGet2D(LinePoints[i] , y, 0);
    			cvSetReal2D(contours , pt.val[1] ,pt.val[0],255);
    			printf("(%f,%f) ",pt.val[0],pt.val[1]);
    		}
    	}
    
    
    	cvShowImage("con" ,contours);
    	cvWaitKey(0);
    #endif
    
    	cvReleaseMemStorage(&storage);
    	cvReleaseImage(&binary_image);
    
    }

     

    // ComputeLinesDis.cpp : Defines the entry point for the console application.
    //
    
    
    
    #include "LinesDis.h"
    
    int main(int argc, char* argv[])
    {
    	//对两条直线进行细化
    	IplImage *pSrc = NULL,*pDst = NULL,*pTmp = NULL;
    
    	//传入一个灰度图像,从文件中读取图像
    	pSrc = cvLoadImage("1.png",CV_LOAD_IMAGE_GRAYSCALE);
    	if(!pSrc)
    	{
    		return 0;
    	}
    
    	pTmp = cvCreateImage(cvGetSize(pSrc),pSrc->depth , pSrc->nChannels);
        pDst = cvCreateImage(cvGetSize(pSrc),pSrc->depth,pSrc->nChannels);
    	cvZero(pDst);//初始化
    	cvThreshold(pSrc,pTmp,128,1,CV_THRESH_BINARY_INV);//做二值处理,将图像转换成0,1
     
    	//第一步 对图像中的直线进行细化
    	ThinImage(pTmp,pDst,80);
    
    
    #define SHOWRESULT
    #ifdef SHOWRESULT
    	cvNamedWindow("src",1);//创建窗口
    	cvNamedWindow("dst",1);
    	cvShowImage("src",pSrc);
    	cvShowImage("dst",pDst);
    #endif
    
    
    
    
    
    	//第二步  提取直线的轮廓坐标
    	CvMat*LinesPoints[2];
    	LinesPoints[0]=0;LinesPoints[1]=0;
    	GetContoursPoints(pDst,LinesPoints);
    
    //#define SHOWCONT
    #ifdef SHOWCONT
    	IplImage* contours = cvCreateImage(cvGetSize(pDst),8,1);
    	cvZero(contours);
    	cvNamedWindow("Mcon");
    	for(int i=0;i<2;i++)
    	{
    		for(int y=0;y<LinesPoints[i]->rows;y++)
    		{
    			CvScalar pt = cvGet2D(LinesPoints[i] , y, 0);
    			cvSetReal2D(contours , pt.val[1] ,pt.val[0],255);
    			cvShowImage("Mcon" ,contours);
    		}
    	}
    
    
    	cvWaitKey(0);
    #endif
    
    
    	//第三步 对轮廓上的坐标进行直线拟合 计算直线方程 By = Ax + b
    	float params[4] , k[2] , b[2] , A , B;
    	cvFitLine(LinesPoints[0] , CV_DIST_L2,1,0.001,0.001,params);
    	k[0] = params[1]/params[0];
    	b[0] = params[3] - k[0]*params[2];
    	A    = k[0];
    	B    = 1;
    
    	printf("y=%f*x+%f \n",k[0]*180.0/3.1415,b[0]);
    
    	cvFitLine(LinesPoints[1] , CV_DIST_L2,1,0.001,0.001,params);
    	k[1] = params[1]/params[0];
    	b[1] = params[3] - k[0]*params[2];
    
    	printf("y=%f*x+%f \n",k[1]*180.0/3.1415,b[1]);
    
    	//第四部  计算两条直线之间的距离 公式是: |b1-b0| / sqrt(A*A + B*B)
    	float 	dis = abs(b[1]-b[0])/sqrt(A*A + B*B);
    
    	printf("dis is %f \n" , dis); 
    
    
    
    	// 释放内存
        cvReleaseImage(&pSrc);
    	cvReleaseImage(&pDst);
    	cvReleaseImage(&pTmp);
    
    	if(LinesPoints[0])
    	cvReleaseMat(&LinesPoints[0]);
    	
    	if(LinesPoints[1]);
    	cvReleaseMat(&LinesPoints[1]);
    	cvWaitKey(0);
    
    	return 0;
    }
    
    

     

     

     

    展开全文
  • 两点间距离 /***** 求两点间距离*****/ float getDistance(CvPoint pointO, CvPoint pointA) { float distance; distance = powf((pointO.x - pointA.x), 2) + powf((pointO.y - pointA.y), 2); distance = ...

     

    求两点间距离

    #***** 求两点间距离*****
    def getDist_P2P(Point0,PointA):
        distance=math.pow((Point0[0]-PointA[0]),2) + math.pow((Point0[1]-PointA[1]),2)
        distance=math.sqrt(distance)
        return distance
    
    
    

    已知直线上两点求直线的一般式方程

    常用的直线方程有一般式 点斜式 截距式 斜截式 两点式等等。除了一般式方程,它们要么不能支持所有情况下的直线(比如跟坐标轴垂直或者平行),要么不能支持所有情况下的点(比如x坐标相等,或者y坐标相等)。所以一般式方程在用计算机处理二维图形数据时特别有用。

    已知直线上两点求直线的一般式方程

    已知直线上的两点P1(X1,Y1) P2(X2,Y2), P1 P2两点不重合。则直线的一般式方程AX+BY+C=0中,A B C分别等于:

    A = Y2 - Y1

    B = X1 - X2

    C = X2*Y1 - X1*Y2

     

    点到直线的距离:P到AB的距离

    
    #***** 点到直线的距离:P到AB的距离*****
    #P为线外一点,AB为线段两个端点
    def getDist_P2L(PointP,Pointa,Pointb):
        """计算点到直线的距离
            PointP:定点坐标
            Pointa:直线a点坐标
            Pointb:直线b点坐标
        """
        #求直线方程
        A=0
        B=0
        C=0
        A=Pointa[1]-Pointb[1]
        B=Pointb[0]-Pointa[0]
        C=Pointa[0]*Pointb[1]-Pointa[1]*Pointb[0]
        #代入点到直线距离公式
        distance=0
        distance=(A*PointP[0]+B*PointP[1]+C)/math.sqrt(A*A+B*B)
        
        return distance
    

     

    展开全文
  • c#实现计算两点之间距离

    热门讨论 2011-09-09 15:49:19
    用c#实现一个简单的计算点之间距离,使用的是面向对象的思想
  • 确保互不信任的参与方分别输入各自隐私信息合作计算, 同时保持各自信息的隐私性, 并且不能通过中间结果计算出其他参与方输入的隐私信息, 最终准确得到两平行线间距离, 并且在理论上证明了协议的正确性和安全性。
  • cad画平行线的中线的方法步骤:cad画平行线的中线的方法一1、很简单,在平行线之间再“offset”一条平行线,与俩条平行线等距。2、在中间平行线上任一点为圆心,定距离为直径做圆,圆与平行线的交点...
  • 平行线怎样相交

    万次阅读 2015-12-23 09:26:37
    原文地址:平行线怎样相交作者:Erik  欧几里德几何认为条平行的直线永远无法相交,爱因斯坦站在宇宙空间的角度猜测平行线有可能能相交,但到底如何相交,爱因斯坦也没有给出证明,科学家们至今也无法...
  • 假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈 就叫作“赤道”。在赤道的南北两边,画出许多和赤道平行的圆圈,就是“纬圈”;构成这些圆圈的线段, 叫做纬线。...
  • 设有两空间线段 Ls,其起点、终点坐标为s0、s1,方向向量u⃗ =s1−s0 Lt,其起点、终点坐标为t0、t1,方向向量v⃗ =t1−t0 ...设最短距离两点分别为sj、tj,则有 sj=s0+sc⋅u⃗ tj=t0+sc⋅v⃗ 其...
  • 一、问题   已知条直线l1(x1,y1,x2,y2)l_1(x_1,y_1,x_2,y_2)l1...若平行,计算出条直线平行距离。 二、分析 y−y1y2−y1=x−x1x2−x1⇒{ax+by+c=0a=−(y2−y1)b=x2−x1c=(y2−y1)x1−(x2−x1)y1k=−ab \fra.
  • halcon垂足、轮廓平行线

    千次阅读 2020-06-04 14:31:01
    1.已知与直线 求垂足 ...2.已知一线轮廓与所求平行线之间距离 已知线轮廓:contour 已知距离:Distance gen_parallel_contour_xld(contour, parallelcontour, ‘regression_normal’, -Distance) ...
  • 平行线拟合问题(附带 C++ 源代码)

    千次阅读 2019-07-28 11:52:05
    影像测量仪测量的长度基本都是这种平行线间距离。 这里假设我们已经获得了足够的数据,第一条直线上的数据形成集合{(x1,i,y1,i)}\{(x_{1,i}, y_{1,i})\}{(x1,i​,y1,i​)},第二条直线上的数据形成集合 ...
  • 根据两点经纬度坐标计算距离

    万次阅读 多人点赞 2015-05-09 11:23:29
    问题提出目前手头的一个项目要用到GPS地理定位信息,很自然的就需要知道个地点之间距离,于是上网找了一下。背景知识这些经纬线是怎样定出来的呢?地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球...
  • 在上述博客中,我分别对平滑滤波、边缘检测、直线检测做了一定程度的了解,那么最终的目的我们是需要解决实际问题,那么今天就试着完成一个简单的综合训练,来在巩固前面所学知识的同时,学到...算出这两平行线之间...
  • 地球经纬度计算两点距离

    千次阅读 2015-12-25 12:42:03
    现在利用——地球经纬度计算两点距离——的基本原理计算气辉层所对应的经纬度距离。  基本原理如下: 纬度分为60分,每一分再分为60秒以及秒的小数。没错,60进制,纬度线投射在图上看似水平的平行线,但...
  • 如果以0度经线为基 准,那么根据地球表面任意两点的经纬度就可以计算出这两点间的地表距离(这里忽略地球表面地形对计算带来的误差,仅仅是理论上的估算值)。设第一点A的经 纬度为(LonA, LatA),第二点B的经纬度为...
  • 折线平行线的计算方法

    千次阅读 2017-10-10 07:57:09
    给定一个简单多边形,多边形按照顺时针或者逆时针的数许排列 内部等距离缩小或者外部放大的多边形,...做平行于L1和L2,平行线间距是L的,并且位于多边形内部的条边,交于Qi 我们要计算出Qi的坐标 如图, P
  • 一、mysql 下 计算 两点 经纬度 之间距离 公式如下,单位米: 第一点经纬度:lng1 lat1 第二点经纬度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin((lat1*pi()/180-lat2*pi()/180)/2),2)+cos(lat1*...
  • 计算空间中两线之间距离

    千次阅读 2020-01-22 21:37:33
    最近在建立气凝胶的有限元模型中需要计算每根纤维之间距离,最初参考的篇文章确实提供了一些数值方法的计算思路(文章1 && 文章2),但忽略了理论推导,导致在用参数 ttt 描述两线段的地方出现了一些...
  • 某一点的经度,就是该所在的经线平面与本初子午线平面的夹角。在赤道上度量,自本初子午线平面作为起点面,分别往东往西度量,往东量值称为东经度,往西量值称为西经度。由此可见,一地的经度是该地对于本初子午...
  • 如果以0度经线为基 准,那么根据地球表面任意两点的经纬度就可以计算出这两点间的地表距离(这里忽略地球表面地形对计算带来的误差,仅仅是理论上的估算值)。设第一点A的经 纬度为(LonA, LatA),第二点B的经纬度为...
  • 球面两点间的球面距离的计算

    千次阅读 2005-01-12 22:50:00
    球面两点间的球面距离的计算 实际上这是一个很简单的问题,今天之所以把他提出来并作出解决方案,是因为昨天在讨论项目的时候,项目lead提出计算地球球面上两点的球面距离是很难的,实际上是一个很简单的立体几何的...
  • 根据两点经纬度计算距离

    万次阅读 2016-07-08 21:57:51
    根据两点经纬度计算距离 这些经纬线是怎样定出来的呢?地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心的 假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离...
  • 三条平行线与等边三角形

    千次阅读 2019-05-15 16:56:38
    原题是:平面上有任意三条平行线,使用尺规则作图画出一个等边三角形,使三角形的三个顶点分别在三条平行线上。 画法有好多种,搜集网上的一些画法,先介绍4种,再讨论一下三角形连长与平等线距离的关系,最后讨论...
  • 第一经纬度:lng1 lat1 第二经纬度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2*pi()/180)/2),2)+cos(lat1*pi()/180)*cos(lat2*pi()/180)* pow(sin( (lng1*pi()/180-lng2*pi()/...
  • 由示意图可知, H、E分别为A、B两点所在纬度圈的圆心,C点为与A点纬度相同,与B点经度相同,F为BC与HE延长线的交点,△HCF∽△DCB,对角平行函数,因此: 因为△AHF为直角三角形,所以 AF^2 = AH^2 + HF^2 (原文...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,473
精华内容 7,789
关键字:

平行线两点之间的距离