最近,因工作需要,在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图像上画直线相关推荐

  1. 易懂的Bresenham 布雷森汉姆算法画圆的原理与Python编程实现教程

    Bresenham 布雷森汉姆算法画圆的原理与编程实现教程 注意:Bresenham的圆算法只是中点画圆算法的优化版本.区别在于Bresenham的算法只使用整数算术,而中点画圆法仍需要浮点数.注意: ...

  2. Python布雷森汉姆直线算法RViz可视化ROS激光占位网格映射

    使用对数赔率映射已知姿势算法(ROS 包). 布雷森汉姆直线算法 布雷森汉姆直线算法是一种线绘制算法,它确定应选择的 n 维栅格的点,以便形成两点之间的直线的近似值. 它通常用于在位图图像中(例如在计 ...

  3. ITK:布雷森汉姆线BresenhamLine

    ITK:布雷森汉姆线BresenhamLine 内容提要 输出结果 C++实现代码 内容提要 在两点之间的布雷森纳姆线上获得点. 输出结果 [0, 0] [1, 1] [2, 2] [3, 3] [0 ...

  4. 【附源码】布雷森汉姆直线算法(bresenham‘s line algorithm)

    1.布雷森汉姆直线算法简介 我们在纸上画直线时,只需要定一个起点和终点,然后把两点连接起来就是一条直线,你将会得到一条笔直的直线. 但是,这个简单的过程,在计算机上却并不容易.首先计算机的屏幕是一个一 ...

  5. 布雷森汉姆直线演算法(Bresenham‘s line algorithm)介绍

    布雷森汉姆直线演算法(Bresenham's line algorithm)是用来描述两点间决定一条直线的算法,本人发现它可以用于确定栅格地图中两点间直线经过的栅格位置,它会算出一条线段在点阵图上最接 ...

  6. 用C语言代码实现布雷森汉姆直线插补

    布雷森汉姆直线插补是计算机图形学中常见的直线插补算法.以下是用C语言实现布雷森汉姆直线插补的代码示例: #include <stdio.h> #include <math.h> ...

  7. 用布雷森汉姆(Bresenham)算法直接在YUV图上绘制图形

    Bresenham的线算法以Jack Elton Bresenham命名,他于1962年在IBM开发.是计算机图形学中的经典算法,恰好最近公司项目中需要实现类似的功能,于是就实践了一把,为了以后爬坑方 ...

  8. 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 ...

  9. VC++ 绘制线条 OnLButtonDown函数(DrawView.cpp) 利用SDK全局函数实现画线功能 利用MFC的CDC类实现画线功能 利用MFC的CClientDC类实现画线功能

    目录 绘制线条 OnLButtonDown函数(DrawView.cpp) 利用SDK全局函数实现画线功能 利用MFC的CDC类实现画线功能 利用MFC的CClientDC类实现画线功能 接上:VC+ ...

最新文章

  1. 微服务实践分享(5)缓存中心
  2. Zedboard学习(七):VGA显示
  3. CRMEB v4目录结构说明
  4. VLC 学习计划---文档阅读
  5. 查找域内所有的Windows Server 2012 R2的服务器,并区分出哪些是物理机,那些是虚拟机...
  6. python 多线程和协程结合_如何让 python 处理速度翻倍?内含代码
  7. ×××数据库导数据ora-01400错误小计
  8. JAVA注释 关键字 标识符 常量 变量 数据类型 大小 类型转换 字符类型 (算术 赋值 自增自减 比较 逻辑短路现象 位移 三元) 运算符
  9. 道路交通安全隐患排查的方法研究
  10. Windows平台实现真实时毫秒级4K H264/H265直播技术(硬编码技术方案)
  11. 【解决】如何将腾讯QLV格式的视频转换成MP4
  12. java stack top_Java中的堆栈类Stack类 - Break易站
  13. ubuntu22.04 耳机没声音 [已解决]
  14. Flutter Sliver滚动组件
  15. 企业微信(H5打开)调用微信小程序
  16. Android Studio 连接不上华为手机
  17. 继承、super、this、抽象类
  18. 淘淘商城---8.9
  19. 霍夫曼树之切割木板最小总代价问题
  20. 目标框检测中准确率、召回率、AP、mAP计算原理及代码

热门文章

  1. win10新建文本文档(TXT)的快捷键
  2. 那些NB的chart网址
  3. python地图坐标系转换(bd09,gcj02,wgs84三种投影坐标系相互转化)
  4. 百度IP定位和百度地图API定位
  5. [绍棠] iphone手机机型判断
  6. 前端已死? 2023 年前端十大 Web 趋势
  7. Python实现秒解数独
  8. Oracle 19.3 Grid Infrastructure 软件安装详细教程
  9. 安卓微信自动抢红包插件实现和优化
  10. jquery的$.ajax()利用FormData数据类型与php后台交互