实现Bresenham提取线段上的所有点(图像栅格化)
2017-10-19 10:30
381 查看
主要是在原来算法的基础上略微修改,增加了对首尾端点的处理:
#include "opencv.hpp"
// 交换整数 a 、b 的值
inline void swap_int(int*a, int *b)
{
*a ^= *b; *b ^= *a; *a ^= *b;
}
// Bresenham's line algorithm
bool GetLinePts(int x1, int y1, int x2, int y2, std::vector<cv::Point>& vPts)
{
//参数 c 为颜色值
//增加第一个端点
cv::Point ptStart(x1, y1);
cv::Point ptEnd(x2, y2);
vPts.push_back(ptStart);
int dx = abs(x2 - x1), dy = abs(y2 - y1), yy = 0;
if (dx < dy)
{
yy = 1;
swap_int(&x1, &y1);
swap_int(&x2, &y2);
swap_int(&dx, &dy);
}
int ix = (x2 - x1) > 0 ? 1 : -1, iy = (y2 - y1) > 0 ? 1 : -1, cx = x1, cy = y1, n2dy = dy * 2, n2dydx = (dy - dx) * 2, d = dy * 2 - dx;
if (yy) { // 如果直线与 x 轴的夹角大于 45 度
while (cx != x2)
{
if (d < 0)
{
d += n2dy;
}
else
{
cy += iy;
d += n2dydx;
}
vPts.push_back(cv::Point(cy, cx));
cx += ix;
}
}
else
{
// 如果直线与 x 轴的夹角小于 45 度
while (cx != x2)
{
if (d < 0)
{
d += n2dy;
}
else
{
cy += iy;
d += n2dydx;
}
vPts.push_back(cv::Point(cx, cy));
cx += ix;
}
}
//需要包含首尾端点,进行处理
if (vPts.size() >= 2 && vPts[0] == vPts[1])
{
vPts.erase(vPts.begin());
}
if (vPts.size() && vPts[vPts.size() - 1] != ptEnd)
{
vPts.push_back(ptEnd);
}
return true;
}
#include "opencv.hpp"
// 交换整数 a 、b 的值
inline void swap_int(int*a, int *b)
{
*a ^= *b; *b ^= *a; *a ^= *b;
}
// Bresenham's line algorithm
bool GetLinePts(int x1, int y1, int x2, int y2, std::vector<cv::Point>& vPts)
{
//参数 c 为颜色值
//增加第一个端点
cv::Point ptStart(x1, y1);
cv::Point ptEnd(x2, y2);
vPts.push_back(ptStart);
int dx = abs(x2 - x1), dy = abs(y2 - y1), yy = 0;
if (dx < dy)
{
yy = 1;
swap_int(&x1, &y1);
swap_int(&x2, &y2);
swap_int(&dx, &dy);
}
int ix = (x2 - x1) > 0 ? 1 : -1, iy = (y2 - y1) > 0 ? 1 : -1, cx = x1, cy = y1, n2dy = dy * 2, n2dydx = (dy - dx) * 2, d = dy * 2 - dx;
if (yy) { // 如果直线与 x 轴的夹角大于 45 度
while (cx != x2)
{
if (d < 0)
{
d += n2dy;
}
else
{
cy += iy;
d += n2dydx;
}
vPts.push_back(cv::Point(cy, cx));
cx += ix;
}
}
else
{
// 如果直线与 x 轴的夹角小于 45 度
while (cx != x2)
{
if (d < 0)
{
d += n2dy;
}
else
{
cy += iy;
d += n2dydx;
}
vPts.push_back(cv::Point(cx, cy));
cx += ix;
}
}
//需要包含首尾端点,进行处理
if (vPts.size() >= 2 && vPts[0] == vPts[1])
{
vPts.erase(vPts.begin());
}
if (vPts.size() && vPts[vPts.size() - 1] != ptEnd)
{
vPts.push_back(ptEnd);
}
return true;
}
相关文章推荐
- 【Web】用遗传算法实现图像边缘提取
- 图形图像处理之——实现图形图像之子区域提取2
- 基于一种改进的提取形状特征向量方法,实现图像检索
- java 使用tess4j实现图像文字提取 eclipse的配置
- 利用OpenCV实现图像纹理特征提取
- Delphi实现提取可执行文件内部所有图标
- 图像处理中,SIFT,FAST,MSER,STAR等特征提取算法的比较与分析(利用openCV实现)
- OTSU算法提取图像阈值的C语言实现
- 图像骨架提取实现
- 利用RobHess源码实现SIFT算法及RANSAC去错的图像特征提取匹配及去除错匹配
- PHP实现提取一个图像文件并显示在浏览器上
- Gabor实现图像特征提取
- 图像增强算法实现--图像边缘提取
- VLFeat——SIFT图像特征提取(VC++实现)【转载】
- OpenCV实现图像颜色特征提取
- 利用SURF特征检测和FLANN最近邻算法实现图像的目标提取
- 图像处理中,SIFT,FAST,MSER,STAR等特征提取算法的比较与分析(利用openCV实现)
- python实现LBP方法提取图像纹理特征实现分类
- 两种图像骨架提取算法的研究(2)实现代码
- 【图像特征提取12】OpenCv的SIFT图像局部特征提取描述算法C++代码的实现