在yuv上画线_利用布雷森汉姆算法绘制在YUV图像上画直线
最近,因工作需要,在YUV图像上画直线;
算法1步骤:
1.已知直线的起点和终点;
2. 利用布雷森汉姆算法在两点间画直线;
3. 将该直线上的点的颜色在YUV图像上画出。
布雷森汉姆算法原理参考wiki: http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
yuv图像转换原理参考:http://en.wikipedia.org/wiki/Yuv
参考代码:
unsigned char breshenham(unsigned char* imgdata, int width, int height, nPoint startPoint, nPoint endPoint, nColor color)
{
if (!imgdata)
{
return -1;
}
if (width < 0 || height < 0 )
{
return -1;
}
if (startPoint.x<0 || startPoint.x > width || startPoint.y < 0 || startPoint.y > height || endPoint.x < 0 || endPoint.x > width || endPoint.y < 0 || endPoint.y > height)
{
return -1;
}
int imgSize = width*height;
int x0 = startPoint.x, x1 = endPoint.x;
int y0 = startPoint.y, y1 = endPoint.y;
int dy = abs(y1 - y0);
int dx = abs(x1 - x0);
bool steep = dy>dx ?true:false;
if (steep)
{
swap(x0, y0);
swap(x1, y1);
}
if (x0 > x1)
{
swap(x0, x1);
swap(y0, y1);
}
int deltax = x1 - x0;
int deltay = abs(y1 - y0);
int error = deltax/2;
int ystep;
int y = y0;
if (y0 < y1)
ystep = 1;
else
ystep = -1;
for (int x = x0; x < x1; x++)
{
if (steep)
{
imgdata[x*width + y] = color.r;
imgdata[imgSize + x/2*width/2 + y/2] = color.g;
imgdata[imgSize + imgSize/4 + x/2*width/2 + y/2] = color.b;
}
else
{
imgdata[y*width + x] = color.r;
imgdata[imgSize + y/2*width/2 + x/2] = color.g;
imgdata[imgSize + imgSize/4 + y/2*width/2 + x/2] = color.b;
}
error -= deltay;
if (error < 0)
{
y += ystep;
error += deltax;
}
}
return 1;
}
算法2步骤:
1.已知直线的起点和终点;
2. 利用super vector bresenham算法在两点间画直线;
3. 将该直线上的点的颜色在YUV图像上画出。
super vector bresenham 算法原理参考wiki: http://lifc.univ-fcomte.fr/home/~ededu/projects/bresenham/
yuv图像转换原理参考:http://en.wikipedia.org/wiki/Yuv
void superVectorBresenham(unsigned char* imgData, int width, int height, nPoint startPoint, nPoint endPoint, nColor color)
{
if (!imgData)
{
return ;
}
if (width<0 || height<0)
{
return;
}
if (startPoint.x < 0 || startPoint.x > width || startPoint.y < 0 || startPoint.y > height ||
endPoint.x < 0 || endPoint.x >width || endPoint.y < 0 || endPoint.y > height)
{
return;
}
int imgSize = width*height;
int yStep, xStep;
int error, errorPrev;
int y = startPoint.y, x = startPoint.x;
int ddy, ddx;
int dx = endPoint.x - startPoint.x;
int dy = endPoint.y - startPoint.y;
//StartPoint()
imgData[y*width + x] = color.r;
imgData[imgSize + y/2*width/2 + x/2] = uData;
imgData[imgSize + imgSize/4 + y/2*width/2 + x/2] = vData;
if (dy < 0)
{
yStep = -1;
dy = -dy;
}
else
yStep = 1;
if (dx < 0)
{
xStep = -1;
dx = -dx;
}
else
xStep = 1;
ddx = 2*dx;
ddy = 2*dy;
if (ddx >= ddy)
{
errorPrev = error = dx;
for (int i=0; i
{
x += xStep;
error += ddy;
if (error > ddx)
{
y += yStep;
error -= ddx;
if (error + errorPrev < ddx)
{//POINT(y-ystep, x)
int tmpY = y - yStep;
imgData[tmpY*width + x] = color.r;
imgData[imgSize + tmpY/2*width/2 + x/2] = color.g;
imgData[imgSize + imgSize/4 + tmpY/2*width/2 + x/2] = color.b;
}
else if (error + errorPrev > ddx)
{
//POINT(y, x-xstep)
int tmpX = x - xStep;
imgData[y*width + tmpX] = color.r;
imgData[imgSize + y/2*width/2 + tmpX/2] = color.g;
imgData[imgSize + imgSize/4 + y/2*width/2 + tmpX/2] = color.b;
}
else
{
//POINT(y-ystep, x)
int tmpY = y - yStep;
imgData[tmpY*width + x] = color.r;
imgData[imgSize + tmpY/2*width/2 + x/2] = color.g;
imgData[imgSize + imgSize/4 + tmpY/2*width/2 + x/2] = color.b;
//POINT(y, x-xstep)
int tmpX = x - xStep;
imgData[y*width + tmpX] = color.r;
imgData[imgSize + y/2*width/2 + tmpX/2] = color.g;
imgData[imgSize + imgSize/4 + y/2*width/2 + tmpX/2] = color.b;
}
}
//POINT(y,x)
imgData[y*width + x] = color.r;
imgData[imgSize + y/2*width/2 + x/2] = color.g;
imgData[imgSize + imgSize/4 + y/2*width/2 + x/2] = color.b;
errorPrev = error;
}
}
else
{
errorPrev = error = dy;
for (int i=0; i
{
y += yStep;
error += ddx;
if (error > ddy)
{
x += xStep;
error -= ddy;
if (error + errorPrev < ddy)
{
//POINT(y, x-xstep)
int tmpX = x - xStep;
imgData[y*width + tmpX] = color.r;
imgData[imgSize + y/2*width/2 + tmpX/2] = color.g;
imgData[imgSize + imgSize/4 + y/2*width/2 + tmpX/2] = color.b;
}
else if (error + errorPrev > ddy)
{
//POINT(y-ystep, x)
int tmpY = y - yStep;
imgData[tmpY*width + x] = color.r;
imgData[imgSize + tmpY/2*width/2 + x/2] = color.g;
imgData[imgSize + imgSize/4 + tmpY/2*width/2 + x/2] = color.b;
}
else
{
//POINT(y, x-xstep)
int tmpX = x - xStep;
imgData[y*width + tmpX] = color.r;
imgData[imgSize + y/2*width/2 + tmpX/2] = color.g;
imgData[imgSize + imgSize/4 + y/2*width/2 + tmpX/2] = color.b;
//POINT(y-ystep, x)
int tmpY = y - yStep;
imgData[tmpY*width + x] = color.r;
imgData[imgSize + tmpY/2*width/2 + x/2] = color.g;
imgData[imgSize + imgSize/4 + tmpY/2*width/2 + x/2] = color.b;
}
}
//POINT(y, x)
imgData[y*width + x] = color.r;
imgData[imgSize + y/2*width/2 + x/2] = color.g;
imgData[imgSize + imgSize/4 + y/2*width/2 + x/2] = color.b;
errorPrev = error;
}
}
}
在yuv上画线_利用布雷森汉姆算法绘制在YUV图像上画直线相关推荐
- 易懂的Bresenham 布雷森汉姆算法画圆的原理与Python编程实现教程
Bresenham 布雷森汉姆算法画圆的原理与编程实现教程 注意:Bresenham的圆算法只是中点画圆算法的优化版本.区别在于Bresenham的算法只使用整数算术,而中点画圆法仍需要浮点数.注意: ...
- Python布雷森汉姆直线算法RViz可视化ROS激光占位网格映射
使用对数赔率映射已知姿势算法(ROS 包). 布雷森汉姆直线算法 布雷森汉姆直线算法是一种线绘制算法,它确定应选择的 n 维栅格的点,以便形成两点之间的直线的近似值. 它通常用于在位图图像中(例如在计 ...
- ITK:布雷森汉姆线BresenhamLine
ITK:布雷森汉姆线BresenhamLine 内容提要 输出结果 C++实现代码 内容提要 在两点之间的布雷森纳姆线上获得点. 输出结果 [0, 0] [1, 1] [2, 2] [3, 3] [0 ...
- 【附源码】布雷森汉姆直线算法(bresenham‘s line algorithm)
1.布雷森汉姆直线算法简介 我们在纸上画直线时,只需要定一个起点和终点,然后把两点连接起来就是一条直线,你将会得到一条笔直的直线. 但是,这个简单的过程,在计算机上却并不容易.首先计算机的屏幕是一个一 ...
- 布雷森汉姆直线演算法(Bresenham‘s line algorithm)介绍
布雷森汉姆直线演算法(Bresenham's line algorithm)是用来描述两点间决定一条直线的算法,本人发现它可以用于确定栅格地图中两点间直线经过的栅格位置,它会算出一条线段在点阵图上最接 ...
- 用C语言代码实现布雷森汉姆直线插补
布雷森汉姆直线插补是计算机图形学中常见的直线插补算法.以下是用C语言实现布雷森汉姆直线插补的代码示例: #include <stdio.h> #include <math.h> ...
- 用布雷森汉姆(Bresenham)算法直接在YUV图上绘制图形
Bresenham的线算法以Jack Elton Bresenham命名,他于1962年在IBM开发.是计算机图形学中的经典算法,恰好最近公司项目中需要实现类似的功能,于是就实践了一把,为了以后爬坑方 ...
- Bresenham‘s line algorithm 布雷森汉姆直线算法
1.线性方程 首先我们假设要绘画的直线斜率大于0小于1. 截距式直线方程如下: y=f(x)=mx+by=f(x)=mx+by=f(x)=mx+b 现在我们要从点(x0,y0)(x_0,y_0)(x0 ...
- VC++ 绘制线条 OnLButtonDown函数(DrawView.cpp) 利用SDK全局函数实现画线功能 利用MFC的CDC类实现画线功能 利用MFC的CClientDC类实现画线功能
目录 绘制线条 OnLButtonDown函数(DrawView.cpp) 利用SDK全局函数实现画线功能 利用MFC的CDC类实现画线功能 利用MFC的CClientDC类实现画线功能 接上:VC+ ...
最新文章
- 微服务实践分享(5)缓存中心
- Zedboard学习(七):VGA显示
- CRMEB v4目录结构说明
- VLC 学习计划---文档阅读
- 查找域内所有的Windows Server 2012 R2的服务器,并区分出哪些是物理机,那些是虚拟机...
- python 多线程和协程结合_如何让 python 处理速度翻倍?内含代码
- ×××数据库导数据ora-01400错误小计
- JAVA注释 关键字 标识符 常量 变量 数据类型 大小 类型转换 字符类型 (算术 赋值 自增自减 比较 逻辑短路现象 位移 三元) 运算符
- 道路交通安全隐患排查的方法研究
- Windows平台实现真实时毫秒级4K H264/H265直播技术(硬编码技术方案)
- 【解决】如何将腾讯QLV格式的视频转换成MP4
- java stack top_Java中的堆栈类Stack类 - Break易站
- ubuntu22.04 耳机没声音 [已解决]
- Flutter Sliver滚动组件
- 企业微信(H5打开)调用微信小程序
- Android Studio 连接不上华为手机
- 继承、super、this、抽象类
- 淘淘商城---8.9
- 霍夫曼树之切割木板最小总代价问题
- 目标框检测中准确率、召回率、AP、mAP计算原理及代码
热门文章
- win10新建文本文档(TXT)的快捷键
- 那些NB的chart网址
- python地图坐标系转换(bd09,gcj02,wgs84三种投影坐标系相互转化)
- 百度IP定位和百度地图API定位
- [绍棠] iphone手机机型判断
- 前端已死? 2023 年前端十大 Web 趋势
- Python实现秒解数独
- Oracle 19.3 Grid Infrastructure 软件安装详细教程
- 安卓微信自动抢红包插件实现和优化
- jquery的$.ajax()利用FormData数据类型与php后台交互