圖片中畫框(C語言實現)
阿新 • • 發佈:2018-11-15
在做視覺分析過程中,經常會進行影象格式的轉換以及在原圖上標框,為了更加清晰的認識影象格式,在這裡手動實現了根據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); }