图片中画框(C语言实现)

版权声明:本文为博主原创文章,欢迎转载。转载请注明出处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);
}

猜你喜欢

转载自blog.csdn.net/jobbofhe/article/details/84065397