YUV数据画矩形和直线
- 划线函数用breshenham算法,yuv数据格式为 422sp 。
//在YUVsp422数据上画直线,imgdata是 YUV数据指针, int width, int height,YUV图像大小。 startPoint,endPoint 直线量端点,color 颜色。目前直线需要偶数其实地址
unsigned char cyf_breshenhamLine(unsigned char* imgdata, int width, int height, my_CvPoint startPoint, my_CvPoint endPoint, my_CvColor 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 t;
int x0 = startPoint.x, x1 = endPoint.x;
int y0 = startPoint.y, y1 = endPoint.y;
int dy = ABS(y1 - y0);
int dx = ABS(x1 - x0);
HI_BOOL steep = dy>dx ?HI_TRUE:HI_FALSE;
HI_BOOL bIsVertical =HI_FALSE; //默认不是竖直的线,竖直的线对列上的uv分量不减少
if (x0 == x1) //如果是竖线的话
{
bIsVertical = HI_TRUE;
}
if (steep)
{
my_CV_SWAP(x0, y0,t);
my_CV_SWAP(x1, y1,t);
}
if (x0 > x1)
{
my_CV_SWAP(x0, x1,t);
my_CV_SWAP(y0, y1,t);
}
int deltax = x1 - x0;
int deltay = ABS(y1 - y0);
int error = deltax/2;
int ystep;
int y = y0;
int x;
if (y0 < y1)
ystep = 1;
else
ystep = -1;
for (x = x0; x < x1; x++)
{
//int stepC=0;
if (steep)
{
/* //yuv422p 算法
imgdata[x*width + y] = color.g;
imgdata[imgSize + x/2*width/2 + y/2] = color.r;
imgdata[imgSize + imgSize/4 + x/2*width/2 + y/2] = color.b;
*/
if(bIsVertical == HI_TRUE) //竖直的线对列上的uv分量不减少
{
imgdata[x*width + y] = color.g;
imgdata[imgSize + x*width + y] = color.r;
imgdata[imgSize + x*width + y+1] = color.b;
}
else{
imgdata[x*width + y] = color.g;
if( x%2 ==0)
{
imgdata[imgSize + x*width + y] = color.r;
}
else
{
imgdata[imgSize + x*width + y] = color.b;
}
}
}
else
{
//yuv422p 算法
/*
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;
*/
//yuv422sp算法
imgdata[y*width + x] = color.g;
if( x%2 ==0)
{
imgdata[imgSize + y*width + x] = color.r;
}
else
{
imgdata[imgSize + y*width + x] = color.b;
}
}
error -= deltay;
if (error < 0)
{
y += ystep;
error += deltax;
}
}
return 1;
}
- 画框
void cyf_drawRect_to_YUVsp422(unsigned char *src ,int SrcWidth,int SrcHeight,my_CvRect rect_rio,my_CvColor color)
{
int RoiWidth = rect_rio.width;
int RoiHeight = rect_rio.height;
int x = rect_rio.x;
int y = rect_rio.y;
int i=0;
int j=0;
my_CvPoint Point[4];
Point[0].x= x;
Point[0].y = y;
Point[1].x = x+RoiWidth-2;
Point[1].y = y;
Point[2].x = x+RoiWidth-2;
Point[2].y = y+RoiHeight-2;
Point[3].x = x;
Point[3].y = y+RoiHeight-2;
cyf_breshenhamLine(src, SrcWidth, SrcHeight, Point[0],Point[1], color);
cyf_breshenhamLine(src, SrcWidth, SrcHeight, Point[1],Point[2], color);
cyf_breshenhamLine(src, SrcWidth, SrcHeight, Point[3],Point[2], color);
cyf_breshenhamLine(src, SrcWidth, SrcHeight, Point[0],Point[3], color);
}