代码来自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 SHOWCONIplImage* 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 SHOWCONCvScalar val = cvGet2D(LinePoints[LinesCount] , i, 0);cvSetReal2D(contours , val.val[1] ,val.val[0],255);cvShowImage("con" ,contours);cvWaitKey(0);
#endif}LinesCount++;}#ifdef SHOWCONfor(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);
#endifcvReleaseMemStorage(&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 SHOWRESULTcvNamedWindow("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 SHOWCONTIplImage* 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 + bfloat 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;
}

OpenCV计算两条平行线之间的距离相关推荐

  1. 【opencv】两条平行线之间的距离

    问题:一张输入图片,图片上有两条平行线,求出这两条平行线之间的距离 解决思路: 1. 对图像中的直线进行细化 2. 提取直线的轮廓坐标 3. 对轮廓上的坐标进行直线集合,从而得到直线方程 4. 计算两 ...

  2. 求空间两条直线之间的距离

    1. 前言 最近老板让写一段空间点匹配的代码, 其中涉及到求空间两直线之间的距离,写起来满费劲的, 这里做一个记录. 2. 处理思路 空间两直线之间的位置关系主要可以分为: 重合, 平行, 相交, 异 ...

  3. sklearn计算两个向量之间的距离

    from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import euc ...

  4. 高德经纬度距离计算php,计算两个经纬度之间的距离 单位(m)

    /** * 计算两个经纬度之间的距离 单位(m) * * @param lat1 * @param lng1 * @param lat2 * @param lng2 * @return */ publ ...

  5. ITK:计算两个索引之间的距离

    ITK:计算两个索引之间的距离 内容提要 输出结果 C++实现代码 内容提要 计算两个索引之间的距离 输出结果 Dist: 1.73205 Dist2: 3 C++实现代码 #include &quo ...

  6. hive 计算两个经纬度之间的距离

    select 6378137*2*ASIN(SQRT(POWER(SIN((lat1-lat2)*ACOS(-1)/360),2) + COS(lat1*ACOS(-1)/180)*COS(lat2* ...

  7. c#语言+计算两个位置的距离,C#计算两个经纬度之间的距离

    最近在项目中有一个功能需要计算两个经纬度之间的距离,在网上找了很多,也试了很多,下面的计算方法得出的结果是精度是最高,希望对大家有所帮助. private const double EARTH_RAD ...

  8. 计算两个点之间的距离

    题目来源:学堂在线_清华大学_JAVA程序设计 编写一个表示二维平面上的点的类MyPoint,满足以下条件: 1.定义private的成员变量x和y,表示点的x和y坐标,类型为double 2.定义两 ...

  9. 计算两个经纬度之间的距离软件_小程序使用腾讯位置服务计算两地之间的距离(有源码)...

    背景: 在最近的小程序开发中,需要计算当前位置到目标位置之间的距离.背靠"腾讯爸爸",没有理由不使用腾讯的位置服务啊!趁着周末把使用方式整理一下,还写了一个demo,和大家分享一下 ...

最新文章

  1. C语言—静态存储与动态存储
  2. 创建游戏场(实战演习)
  3. asp.net web常用控件FileUpload(文件上传控件)
  4. 技术分享 | jaeger链路日志实现
  5. ddr2的上电顺序_关于内存的插入顺序的问题
  6. Linux编程 7 (实时监测进程 top, 结束进程kill,killall)
  7. Shadow Map阴影贴图技术之探 【转】
  8. 刘谦春晚再掀魔术热 网上木马趁火打劫
  9. MATLAB GUI的界面归一化问题
  10. 四阶龙格库塔法的基本思想_四阶龙格库塔法(Runge-Kutta)求解微分方程.PDF
  11. IE假死-在地址栏输入URL地址弹出新窗口的解决方法
  12. 平面设计构成原理分享
  13. 记zabbix正常启动,但是没有监听任何端口问题
  14. 由浅入深讲二叉树4种遍历算法的由来
  15. HTML无序列表四大名著
  16. 教你如何使用SwipeRefreshLayout来构建一个上拉加载下拉刷新框架
  17. 如何将word文档转换成电子书?
  18. JavaScript <script>
  19. CSDN如何转载他人文章
  20. 银河麒麟和鸿蒙系统,国产银河麒麟操作系统V10发布 兼容300万APP厉害了

热门文章

  1. sql goup by sum
  2. 访问一个网站都经过哪些步骤_轻松访问电子商务网站的10个简单步骤
  3. 虚拟服务器mac地址会变化,同一台主机的IP地址变了 mac地址会变吗
  4. WindowBlinds破解全书
  5. 企业微信私域流量运营神器
  6. 23 种设计模式很污的解释
  7. [Vue warn]: Missing required prop: value
  8. apche包中的hash获得
  9. 《微信小程序案例10》后端服务器与mysql数据库与前端微信小程序
  10. 基于OneData的数据仓库建设方案