1. 程式人生 > >圖片中畫框(C語言實現)

圖片中畫框(C語言實現)

在做視覺分析過程中,經常會進行影象格式的轉換以及在原圖上標框,為了更加清晰的認識影象格式,在這裡手動實現了根據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);
}