Opencv中直线的表示方法
# include <iostream >
# include "opencv2/core/core.hpp"
# include "opencv2/highgui/highgui.hpp"
# include "opencv2/imgproc/imgproc.hpp"
//【blog算法原理】Opencv中直线的表示方法
// jsxyhelu 2016年1月20日
using namespace std;
using namespace cv;
void main()
{
Mat src;
Mat board; //用于将识别出来直线绘制出来
Mat board2;
vector <Vec4i > lines;
vector <Vec2f > linesf;
///////////////////////主要流程///////////////////////////////////////
src = imread( "PureLine.jpg", 0);
board = Mat : :zeros(src.size(),src.type());
board2 = Mat : :zeros(src.size(),src.type());
////HoughLineP测试
HoughLinesP(src, lines, 1, CV_PI / 180, 50, 50, 10 );
////HoughLine测试
HoughLines(src, linesf, 1, CV_PI / 180, 100, 0, 0 );
///////////////////////显示结果///////////////////////////////////////
for( size_t i = 0; i < lines.size(); i ++ ){
Vec4i l = lines[i];
line( board, Point(l[ 0], l[ 1]), Point(l[ 2], l[ 3]), Scalar( 255), 1, CV_AA);
}
for( size_t i = 0; i < linesf.size(); i ++ ){
float rho = linesf[i][ 0], theta = lines[i][ 1];
Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a *rho, y0 = b *rho;
pt1.x = cvRound(x0 + 1000 *( -b));
pt1.y = cvRound(y0 + 1000 *(a));
pt2.x = cvRound(x0 - 1000 *( -b));
pt2.y = cvRound(y0 - 1000 *(a));
line( board2, pt1, pt2, Scalar( 255), 1, CV_AA);
}
imshow( "src",src);
waitKey();
}
float t = ( float)(src.cols +src.rows);
pt1.x = cvRound(Line1[ 2] - Line1[ 0] *t);
pt1.y =cvRound(Line1[ 3] -Line1[ 1] *t);
pt2.x = cvRound(Line1[ 2] +Line1[ 0] *t);
pt2.y = cvRound(Line1[ 3] +Line1[ 1] *t);
line( src, pt1, pt2, Scalar( 255), 1, CV_AA);
//对结果图像进行旋转
Point center = Point( src.cols / 2, src.rows / 2 ); //以图像中心为中心
double angle =atan(Line1[ 1] /Line1[ 0]);
angle = Rad2Deg(angle); //由弧度转换为角度
/// 通过上面的旋转细节信息求得旋转矩阵
Mat rot_mat = getRotationMatrix2D( center, angle, 1 );
/// 旋转已扭曲图像
warpAffine( src, dst, rot_mat, src.size() );
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python中的字符串
Python中的字符串 可能大多数人在学习C语言的时候,最先接触的数据类型就是字符串,因为大多教程都是以"Hello world"这个程序作为入门程序,这个程序中要打印的"Hello world"就是字符串。如果你做过自然语言处理方面的研究,并且用Python去做过相关实验,你肯定会体会到Python在字符串处理方面相对于其他语言的明显优势之处。今天我们来了解一下Python中的字符串,看看它的用法。 一.Python中如何声明字符串 在Python中声明一个字符串通常有三种方法:在它的两边加上那个单引号、双引号或者三引号。 如: 从上面可以看出三种声明方法的效果是完全一样的,在Python中用这三种声明方法来声明字符串意义完全等同的,即'hello world'和"hello world"以及'''hello world'''是没有任何区别的。但是会有人问:既然是完全等同的,为什么要弄出三种声明方式呢?下面看一下这几个例子: 在Python中提供了这几种方法,使得使用起来更加方便灵活(当然也可以使用转义字符去解决上面报错的地方)。 在这里要注意的是, 1)在Python中没...
- 下一篇
RANSAC和Flitline
【blog算法原理】RANSAC和FitLine 如果已经有一系列图片,需要拟合出最为合适的一条直线出来,这个时候你会选择RANSAC还是FitLine。 一、算法定义; RANSAC是实际运用非常广泛的算法,它的数学表示为 "Ransac 是解决这类问题的代表性算法。它是一种随机算法,步骤如下: 输入:k,n,t,d,model,dataBestModel = null;迭代k次——(1)从data中随机取出n个点,用这n个点去拟合model和模型的model,将得到的带参数的model记为MaybeBestModel。(2)依次取出剩下的点,计算该点对应MaybeBestModel模型的误差,如果这个误差小于阈值t,则认为这个点是有效的,把这个点也放进MaybeBestModel中。(3)所有点取完了。这时,MaybeBestModel中有效点的数量是否大于或等于d,如果是,则对于MaybeBestModel,重新计算一下它的模型参数。 (4)评估一下MaybeBestModel和BestModel哪一个好?如果MaybeBestModel更好,则将MaybeBestMod...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Hadoop3单机部署,实现最简伪集群
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题