版权声明:本文为博主原创文章,欢迎转载。转载请注明出处http://blog.csdn.net/jobbofhe https://blog.csdn.net/jobbofhe/article/details/84065397
在做视觉分析过程中,经常会进行图像格式的转换以及在原图上标框,为了更加清晰的认识图像格式,在这里手动实现了根据YUV数据和RGB数据进行标框的操作。在性能上不及直接使用opencv + cuda, 但是可以更加直观的理解整个原理。
// draw line
// 传入imgData 是 rgb格式
static int visionDrawLine(float *imgData,int iWidth, int iHeight,int startX, int startY, int endX, int endY)
{
int lineX1, lineX2, lineY1, lineY2;
int nLoop;
if (NULL == imgData || endX < 0 || endY < 0
|| startX < 0 || startY < 0 || iWidth < 0 || iHeight < 0)
{
return -1;
}
if (startX == endX)
{
lineX1 = startX;
lineY1 = startY;
lineY2 = endY;
if (startY > endY)
{
lineY1 = endY;
lineY2 = startY;
}
for (nLoop = lineY1; nLoop < lineY2; nLoop++)
{
imgData[nLoop*iWidth + startX] = 1;
imgData[iWidth*iHeight+nLoop*iWidth + startX] = 1;
imgData[iWidth*iHeight*2+nLoop*iWidth + startX] = 0;
}
}
else if(startY == endY)
{
lineY1 = startY;
lineX1 = startX;
lineX2 = endX;
if (startX > endX)
{
lineX1 = endX;
lineX2 = startX;
}
for (nLoop = lineX1; nLoop < lineX2; nLoop++)
{
imgData[lineY1*iWidth + nLoop] = 1;
imgData[iWidth*iHeight+lineY1*iWidth + nLoop] = 1;
imgData[iWidth*iHeight*2+lineY1*iWidth + nLoop] = 0;
}
}
else
{
return -1;
}
return 0;
}
// 传入imgData 是 YUV420格式
static int visionDrawLine(float *imgData,int iWidth, int iHeight,int startX, int startY, int endX, int endY)
{
int lineX1, lineX2, lineY1, lineY2;
int nLoop;
if (NULL == imgData || endX < 0 || endY < 0
|| startX < 0 || startY < 0 || iWidth < 0 || iHeight < 0)
{
return -1;
}
if (startX == endX)
{
lineX1 = startX;
lineY1 = startY;
lineY2 = endY;
if (startY > endY)
{
lineY1 = endY;
lineY2 = startY;
}
for (nLoop = lineY1; nLoop < lineY2; nLoop++)
{
imgData[nLoop*iWidth + startX] = 1;
}
}
else if(startY == endY)
{
lineY1 = startY;
lineX1 = startX;
lineX2 = endX;
if (startX > endX)
{
lineX1 = endX;
lineX2 = startX;
}
for (nLoop = lineX1; nLoop < lineX2; nLoop++)
{
imgData[lineY1*iWidth + nLoop] = 1;
}
}
else
{
return -1;
}
return 0;
}
// draw rect
void visionDrawRect(float *srcRgb, int srcH, int srcW, int srcC, SC_RECT *rect, int r, int g, int b)
{
int left = rect->x;
int top = rect->y;
int right = rect->x + rect->w;
int bot = rect->y + rect->h;
visionDrawLine(srcRgb, srcW, srcH, left,top, right, top);
visionDrawLine(srcRgb, srcW, srcH, left,top, left, bot);
visionDrawLine(srcRgb, srcW, srcH, right,top, right, bot);
visionDrawLine(srcRgb, srcW, srcH, left,bot, right, bot);
}