利用布雷森汉姆算法绘制在YUV图像上画直线
来源:互联网 发布:阿里云没404 编辑:程序博客网 时间:2024/04/30 19:26
最近,因工作需要,在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;elseystep = -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;}elseyStep = 1;if (dx < 0){xStep = -1;dx = -dx;}elsexStep = 1;ddx = 2*dx;ddy = 2*dy;if (ddx >= ddy){errorPrev = error = dx;for (int i=0; i<dx; 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<dy; 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图像上画直线
- 利用梯度方向在图像上提取直线的方法
- GDI/GDI+ 在图像上画直线
- 在OpenCV中利用鼠标绘制直线
- MFC在静态控件上绘制直线
- OpenCV3_C++_Lines()在图像上画直线 实例
- 直线绘制算法
- dda直线绘制算法
- 直线绘制算法
- 在位图上绘制直线、图形或者文字
- cvPutText:在图像上绘制文本字符串
- 在canvas上绘制视频图像
- 在canvas上绘制视频图像2
- 利用OpenCV绘制可变直线
- 在linux窗口上显示YUV图像源代码
- 学习DDA直线绘制算法
- 直线段生成绘制算法
- 图像的绘制 直线 椭圆 圆形 多边形
- 设计上的错误
- HDU1799 循环了多少?
- Android控件的动画效果的实现及其AnimationListener和Interpolator的使用方法
- Cocos2d-x学习之创建Android工程和编译
- JS 将字符串转换成日期类型
- 利用布雷森汉姆算法绘制在YUV图像上画直线
- linux下C语言编程1-gdb调试程序
- iOS百度地图 定位的实现
- (转)Socket模型编程详解
- weblogic配置domain的监听端口
- Android开发:在外部存储卡上生成文件
- 向前一步:女性,工作及领导意志
- C++ inline函数
- 什么是thunk技术实现?