Library for MAXREFDES131 OneWire GridEYE sensor interface
Dependents: MAXREFDES131_Qt_Demo MAXREFDES130_131_Demo
Diff: API_Level_2/grideye_api_lv2.c
- Revision:
- 1:9e457e35e2e3
- Child:
- 3:5b025369ad96
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/API_Level_2/grideye_api_lv2.c Sat Apr 30 01:27:34 2016 +0000 @@ -0,0 +1,1158 @@ +/******************************************************************************* + include file +*******************************************************************************/ +#include "grideye_api_common.h" +#include "grideye_api_lv1.h" + + +/******************************************************************************* + macro definition +*******************************************************************************/ +#define TRUE (1) +#define FALSE (0) + +#define SHORT_MAX_VAL ( 32767) /* 0x7FFF */ +#define SHORT_MIN_VAL (-32768) /* 0x8000 */ +#define ULONG_MAX_VAL ( 4294967295) /* 0xFFFFFFFF */ + +/* Grid-EYE's number of pixels */ +#define SNR_SZ_X (8) +#define SNR_SZ_Y (8) +#define SNR_SZ (SNR_SZ_X * SNR_SZ_Y) + + +/******************************************************************************* + public method + ******************************************************************************/ + +/*------------------------------------------------------------------------------ + Calculate average. +------------------------------------------------------------------------------*/ +short shAMG_PUB_CMN_CalcAve( short* pshArray, USHORT usSize, UCHAR ucSkip, UCHAR ucMedian, BOOL* pbMedianWork ) +{ + short shAve = 0; + + if( 1 >= usSize ) + { + return( *pshArray ); + } + + /* Adjust parameter. */ + if( 1 > ucSkip ) + { + ucSkip = 1; + } + if( ucMedian > ((usSize - 1) / 2) ) + { + ucMedian = ((usSize - 1) / 2); + } + + /* Calculate average. */ + if( 0 == ucMedian ) + { + USHORT usCnt = 0; + long loSum = 0; + + for( usCnt = 0; usCnt < usSize; usCnt++ ) + { + short shCurData = pshArray[usCnt * ucSkip]; + loSum += shCurData; + } + shAve = (short)(loSum / usSize); + } + else + { + USHORT usCnt = 0; + long loSum = 0; + UCHAR ucMedianCnt = 0; + + for( usCnt = 0; usCnt < usSize; usCnt++ ) + { + pbMedianWork[usCnt] = TRUE; + } + + for( ucMedianCnt = 0; ucMedianCnt < ucMedian; ucMedianCnt++ ) + { + short shMaxData = SHORT_MIN_VAL; + short shMinData = SHORT_MAX_VAL; + UCHAR ucIndex = 0; + + for( usCnt = 0; usCnt < usSize; usCnt++ ) + { + if( FALSE != pbMedianWork[usCnt] ) + { + short shCurData = pshArray[usCnt * ucSkip]; + if( shMaxData < shCurData ) + { + shMaxData = shCurData; + ucIndex = usCnt; + } + } + } + pbMedianWork[ucIndex] = FALSE; + + for( usCnt = 0; usCnt < usSize; usCnt++ ) + { + if( FALSE != pbMedianWork[usCnt] ) + { + short shCurData = pshArray[usCnt * ucSkip]; + if( shMinData > shCurData ) + { + shMinData = shCurData; + ucIndex = usCnt; + } + } + } + pbMedianWork[ucIndex] = FALSE; + } + + for( usCnt = 0; usCnt < usSize; usCnt++ ) + { + short shCurData = pshArray[usCnt * ucSkip]; + if( FALSE != pbMedianWork[usCnt] ) + { + loSum += shCurData; + } + } + shAve = (short)(loSum / ( usSize - ucMedian * 2 )); + } + + return( shAve ); +} + +/*------------------------------------------------------------------------------ + Calculate average. +------------------------------------------------------------------------------*/ +short shAMG_PUB_CMN_CalcIIR( short shVal1, short shVal2, short shTh ) +{ + const short c_shMinTh = 0; + const short c_shMaxTh = 256; + long loAddVal = 0; + + /* Adjust parameter. */ + if( c_shMinTh > shTh ) + { + shTh = c_shMinTh; + } + if( c_shMaxTh < shTh ) + { + shTh = c_shMaxTh; + } + + /* Calculate average. */ + loAddVal = (long)shTh * ( shVal2 - shVal1 ); + return( shVal1 + (short)(loAddVal / c_shMaxTh) ); +} + +/*------------------------------------------------------------------------------ + Calculate average. +------------------------------------------------------------------------------*/ +short shAMG_PUB_CMN_CalcIIR_f( short shVal1, short shVal2, float fTh ) +{ + const float c_fMinTh = 0; + const float c_fMaxTh = 1; + float fAddVal = 0; + + /* Adjust parameter. */ + if( c_fMinTh > fTh ) + { + fTh = c_fMinTh; + } + if( c_fMaxTh < fTh ) + { + fTh = c_fMaxTh; + } + /* Calculate average. */ + fAddVal = fTh * ( shVal2 - shVal1 ); + return( shVal1 + (short)fAddVal ); +} + +/*------------------------------------------------------------------------------ + Convert image : ( x, y ) -> ( ucWidth-1-x , y ) +------------------------------------------------------------------------------*/ +void vAMG_PUB_IMG_ConvertFlipX( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg ) +{ + { + UCHAR ucX = 0; + UCHAR ucY = 0; + for( ucY = 0; ucY < ucHeight; ucY++ ) + { + for( ucX = 0; ucX < (ucWidth+1)/2; ucX++ ) + { + USHORT usIndex1 = (USHORT)( ucX) + ucY * ucWidth; + USHORT usIndex2 = (USHORT)(ucWidth - 1 - ucX) + ucY * ucWidth; + short shVal = pshInImg[usIndex1]; + pshOutImg[usIndex1] = pshInImg[usIndex2]; + pshOutImg[usIndex2] = shVal; + } + } + } +} + +/*------------------------------------------------------------------------------ + Convert image : ( x, y ) -> ( x, ucHeight-1-y ) +------------------------------------------------------------------------------*/ +void vAMG_PUB_IMG_ConvertFlipY( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg ) +{ + { + UCHAR ucX = 0; + UCHAR ucY = 0; + for( ucY = 0; ucY < (ucHeight+1)/2; ucY++ ) + { + for( ucX = 0; ucX < ucWidth; ucX++ ) + { + USHORT usIndex1 = (USHORT)ucX + ( ucY) * ucWidth; + USHORT usIndex2 = (USHORT)ucX + (ucHeight - 1 - ucY) * ucWidth; + short shVal = pshInImg[usIndex1]; + pshOutImg[usIndex1] = pshInImg[usIndex2]; + pshOutImg[usIndex2] = shVal; + } + } + } +} + +/*------------------------------------------------------------------------------ + Convert image : ( x, y ) -> ( y, x ) +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_IMG_ConvertFlipXY( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg ) +{ + BOOL bRet = FALSE; + + if( ucWidth == ucHeight ) + { + UCHAR ucX = 0; + UCHAR ucY = 0; + for( ucY = 0; ucY < ucHeight; ucY++ ) + { + for( ucX = ucY; ucX < ucWidth; ucX++ ) + { + USHORT usIndex1 = (USHORT)ucX + ucY * ucWidth; + USHORT usIndex2 = (USHORT)ucY + ucX * ucWidth; + short shVal = pshInImg[usIndex1]; + pshOutImg[usIndex1] = pshInImg[usIndex2]; + pshOutImg[usIndex2] = shVal; + } + } + bRet = TRUE; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Convert image : ( x, y ) -> ( ucHeight-1-y, x ) +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_IMG_ConvertRotate90( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg ) +{ + BOOL bRet = FALSE; + + if( ucWidth == ucHeight ) + { + UCHAR ucX = 0; + UCHAR ucY = 0; + for( ucY = 0; ucY < (ucHeight+1)/2; ucY++ ) + { + for( ucX = ucY; ucX < ucWidth - ucY - 1; ucX++ ) + { + USHORT usIndex1 = (USHORT)( ucX) + ( ucY) * ucWidth; + USHORT usIndex2 = (USHORT)( ucY) + (ucWidth - 1 - ucX) * ucWidth; + USHORT usIndex3 = (USHORT)(ucWidth - 1 - ucX) + (ucWidth - 1 - ucY) * ucWidth; + USHORT usIndex4 = (USHORT)(ucWidth - 1 - ucY) + ( ucX) * ucWidth; + short shVal = pshInImg[usIndex1]; + pshOutImg[usIndex1] = pshInImg[usIndex2]; + pshOutImg[usIndex2] = pshInImg[usIndex3]; + pshOutImg[usIndex3] = pshInImg[usIndex4]; + pshOutImg[usIndex4] = shVal; + } + if( ucX == ucY ) + { + USHORT usIndex = (USHORT)ucX + ucY * ucWidth; + pshOutImg[usIndex] = pshInImg[usIndex]; + } + } + + bRet = TRUE; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Convert image : ( x, y ) -> ( ucWidth-1-x, ucHeight-1-y ) +------------------------------------------------------------------------------*/ +void vAMG_PUB_IMG_ConvertRotate180( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg ) +{ + USHORT usSize = ucWidth * ucHeight; + USHORT usIndex1 = 0; + + for( usIndex1 = 0; usIndex1 < (usSize+1)/2; usIndex1++ ) + { + USHORT usIndex2 = usSize - 1 - usIndex1; + short shVal = pshInImg[usIndex1]; + pshOutImg[usIndex1] = pshInImg[usIndex2]; + pshOutImg[usIndex2] = shVal; + } +} + +/*------------------------------------------------------------------------------ + Convert image : ( x, y ) -> ( y, ucWidth-1-x ) +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_IMG_ConvertRotate270( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg ) +{ + BOOL bRet = FALSE; + + if( ucWidth == ucHeight ) + { + UCHAR ucX = 0; + UCHAR ucY = 0; + for( ucY = 0; ucY < (ucHeight+1)/2; ucY++ ) + { + for( ucX = ucY; ucX < ucWidth - ucY - 1; ucX++ ) + { + USHORT usIndex1 = (USHORT)( ucX) + ( ucY) * ucWidth; + USHORT usIndex2 = (USHORT)(ucWidth - 1 - ucY) + ( ucX) * ucWidth; + USHORT usIndex3 = (USHORT)(ucWidth - 1 - ucX) + (ucWidth - 1 - ucY) * ucWidth; + USHORT usIndex4 = (USHORT)( ucY) + (ucWidth - 1 - ucX) * ucWidth; + short shVal = pshInImg[usIndex1]; + pshOutImg[usIndex1] = pshInImg[usIndex2]; + pshOutImg[usIndex2] = pshInImg[usIndex3]; + pshOutImg[usIndex3] = pshInImg[usIndex4]; + pshOutImg[usIndex4] = shVal; + } + if( ucX == ucY ) + { + USHORT usIndex = (USHORT)ucX + ucY * ucWidth; + pshOutImg[usIndex] = pshInImg[usIndex]; + } + } + + bRet = TRUE; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Linear interpolation : 8 x 8 -> 15 x 15 +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_IMG_LinearInterpolationSQ15( short* pshInImg, short* pshOutImg ) +{ + const UCHAR c_ucImgWidth = 15; + const UCHAR c_ucImgHeight = 15; + BOOL bRet = FALSE; + + if( pshInImg != pshOutImg ) + { + UCHAR ucX = 0; + UCHAR ucY = 0; + for( ucY = 0; ucY < c_ucImgHeight; ucY += 2 ) + { + for( ucX = 0; ucX < c_ucImgWidth; ucX += 2 ) + { + UCHAR ucSnr = ucX / 2 + ucY / 2 * SNR_SZ_X; + UCHAR ucImg = ucX + ucY * c_ucImgWidth; + pshOutImg[ucImg] = pshInImg[ucSnr]; + } + for( ucX = 1; ucX < c_ucImgWidth; ucX += 2 ) + { + UCHAR ucImg = ucX + ucY * c_ucImgWidth; + pshOutImg[ucImg] = ( pshOutImg[ucImg-1] + pshOutImg[ucImg+1] ) / 2; + } + } + for( ucY = 1; ucY < c_ucImgHeight; ucY += 2 ) + { + for( ucX = 0; ucX < c_ucImgWidth; ucX++ ) + { + UCHAR ucImg = ucX + ucY * c_ucImgWidth; + pshOutImg[ucImg] = ( pshOutImg[ucImg-c_ucImgWidth] + pshOutImg[ucImg+c_ucImgWidth] ) / 2; + } + } + + bRet = TRUE; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Linear interpolation : 8 x 8 -> ucWidth x ucHeight +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_IMG_LinearInterpolation( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg ) +{ + const UCHAR c_ucRes = 16; + BOOL bRet = FALSE; + + if( pshInImg != pshOutImg ) + { + USHORT usImg = 0; + + for( usImg = 0; usImg < ucWidth * ucHeight; usImg++ ) + { + UCHAR ucImgX = usImg % ucWidth; + UCHAR ucImgY = usImg / ucWidth; + USHORT usSnrXn = (USHORT)( c_ucRes * ucImgX * (SNR_SZ_X-1) / (ucWidth -1) ); + USHORT usSnrYn = (USHORT)( c_ucRes * ucImgY * (SNR_SZ_Y-1) / (ucHeight-1) ); + UCHAR ucSnrX = (UCHAR)( usSnrXn / c_ucRes ); + UCHAR ucSnrY = (UCHAR)( usSnrYn / c_ucRes ); + UCHAR ucRateX1 = (UCHAR)( usSnrXn % c_ucRes ); + UCHAR ucRateY1 = (UCHAR)( usSnrYn % c_ucRes ); + UCHAR ucRateX0 = c_ucRes - ucRateX1; + UCHAR ucRateY0 = c_ucRes - ucRateY1; + UCHAR ucSnr = ucSnrX + ucSnrY * SNR_SZ_X; + long loWork = 0; + + if( ucImgX == (ucWidth - 1) ) + { + if( ucImgY == (ucHeight - 1) ) + { + loWork += (long)pshInImg[ucSnr ]; + } + else + { + loWork += (long)pshInImg[ucSnr ] * ucRateY0; + loWork += (long)pshInImg[ucSnr + SNR_SZ_X] * ucRateY1; + loWork /= c_ucRes; + } + } + else + { + if( ucImgY == (ucHeight - 1) ) + { + loWork += (long)pshInImg[ucSnr ] * ucRateX0; + loWork += (long)pshInImg[ucSnr + 1 ] * ucRateX1; + loWork /= c_ucRes; + } + else + { + loWork += (long)pshInImg[ucSnr ] * ucRateX0 * ucRateY0; + loWork += (long)pshInImg[ucSnr + 1 ] * ucRateX1 * ucRateY0; + loWork += (long)pshInImg[ucSnr + SNR_SZ_X] * ucRateX0 * ucRateY1; + loWork += (long)pshInImg[ucSnr + 1 + SNR_SZ_X] * ucRateX1 * ucRateY1; + loWork /= c_ucRes * c_ucRes; + } + } + pshOutImg[usImg] = (short)loWork; + } + + bRet = TRUE; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Image dilation. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_IMG_ImageDilation1( UCHAR ucWidth, UCHAR ucHeight, UCHAR* pucInImg, UCHAR* pucOutImg ) +{ + USHORT usImg = 0; + USHORT usSize = ucWidth * ucHeight; + BOOL bRet = FALSE; + + if( pucInImg != pucOutImg ) + { + for( usImg = 0; usImg < usSize; usImg++ ) + { + pucOutImg[usImg] = 0; + } + for( usImg = 0; usImg < usSize; usImg++ ) + { + UCHAR ucImgX = usImg % ucWidth; + UCHAR ucImgY = usImg / ucWidth; + + if( 0 != pucInImg[usImg] ) + { + pucOutImg[usImg] = 1; + if( 0 != ucImgX ) + { + pucOutImg[usImg - 1] = 1; + } + if( (ucWidth - 1) != ucImgX ) + { + pucOutImg[usImg + 1] = 1; + } + if( 0 != ucImgY ) + { + pucOutImg[usImg - ucWidth] = 1; + } + if( (ucHeight - 1) != ucImgY ) + { + pucOutImg[usImg + ucWidth] = 1; + } + } + } + + bRet = TRUE; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Image dilation. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_IMG_ImageDilation2( UCHAR ucWidth, UCHAR ucHeight, UCHAR ucLabelNo, UCHAR* pucInImg, UCHAR* pucOutImg ) +{ + USHORT usImg = 0; + USHORT usSize = ucWidth * ucHeight; + BOOL bRet = FALSE; + + if( pucInImg != pucOutImg ) + { + for( usImg = 0; usImg < usSize; usImg++ ) + { + pucOutImg[usImg] = 0; + } + for( usImg = 0; usImg < usSize; usImg++ ) + { + UCHAR ucImgX = usImg % ucWidth; + UCHAR ucImgY = usImg / ucWidth; + + if( ucLabelNo == pucInImg[usImg] ) + { + pucOutImg[usImg] = 1; + if( 0 != ucImgX ) + { + pucOutImg[usImg - 1] = 1; + } + if( (ucWidth - 1) != ucImgX ) + { + pucOutImg[usImg + 1] = 1; + } + if( 0 != ucImgY ) + { + pucOutImg[usImg - ucWidth] = 1; + } + if( (ucHeight - 1) != ucImgY ) + { + pucOutImg[usImg + ucWidth] = 1; + } + } + } + + bRet = TRUE; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Object detection. +------------------------------------------------------------------------------*/ +void vAMG_PUB_ODT_CalcDiffImage( USHORT usSize, short* pshInImg1, short* pshInImg2, short* pshOutImg ) +{ + USHORT usImg = 0; + + for( usImg = 0; usImg < usSize; usImg++ ) + { + pshOutImg[usImg] = pshInImg1[usImg] - pshInImg2[usImg]; + } +} + +/*------------------------------------------------------------------------------ + Object detection. +------------------------------------------------------------------------------*/ +void vAMG_PUB_ODT_CalcDetectImage1( USHORT usSize, short* pshInImg, short shTh, UCHAR ucMark, UCHAR* pucOutImg ) +{ + USHORT usImg = 0; + + for( usImg = 0; usImg < usSize; usImg++ ) + { + pucOutImg[usImg] = ( shTh <= pshInImg[usImg] ) ? ucMark : 0; + } +} + +/*------------------------------------------------------------------------------ + Object detection. +------------------------------------------------------------------------------*/ +void vAMG_PUB_ODT_CalcDetectImage2( USHORT usSize, short* pshInImg, short* pshTh, UCHAR ucMark, UCHAR* pucOutImg ) +{ + USHORT usImg = 0; + + for( usImg = 0; usImg < usSize; usImg++ ) + { + pucOutImg[usImg] = ( pshTh[usImg] <= pshInImg[usImg] ) ? ucMark : 0; + } +} + +/*------------------------------------------------------------------------------ + Labeling. +------------------------------------------------------------------------------*/ +UCHAR ucAMG_PUB_ODT_CalcDataLabeling8( UCHAR ucWidth, UCHAR ucHeight, UCHAR ucMark, USHORT usArea, UCHAR* pucImg, USHORT* pusSearchList ) +{ + USHORT usImg = 0; + USHORT usSize = ucWidth * ucHeight; + UCHAR ucDetectNum = 0; + + for( usImg = 0; usImg < usSize; usImg++ ) + { + UCHAR ucLabelNum = 0; + USHORT usIndex = 0; + USHORT usIndexAdd = 0; + + if( ucMark == pucImg[usImg] ) + { + pucImg[usImg] = 0; + pusSearchList[usIndex] = usImg; + usIndexAdd = 1; + } + + while( usIndex < usIndexAdd ) + { + UCHAR ucX = pusSearchList[usIndex] % ucWidth; + UCHAR ucY = pusSearchList[usIndex] / ucWidth; + { + if( 0 <= (ucY - 1) ) + { + USHORT usCheckIndex = (ucX ) + (ucY-1) * ucWidth; + if( ucMark == pucImg[usCheckIndex] ) + { + pucImg[usCheckIndex] = 0; + pusSearchList[usIndexAdd++] = usCheckIndex; + } + } + if( ucHeight > (ucY + 1) ) + { + USHORT usCheckIndex = (ucX ) + (ucY+1) * ucWidth; + if( ucMark == pucImg[usCheckIndex] ) + { + pucImg[usCheckIndex] = 0; + pusSearchList[usIndexAdd++] = usCheckIndex; + } + } + } + if( 0 <= (ucX - 1) ) + { + { + USHORT usCheckIndex = (ucX-1) + (ucY ) * ucWidth; + if( ucMark == pucImg[usCheckIndex] ) + { + pucImg[usCheckIndex] = 0; + pusSearchList[usIndexAdd++] = usCheckIndex; + } + } + if( 0 <= (ucY - 1) ) + { + USHORT usCheckIndex = (ucX-1) + (ucY-1) * ucWidth; + if( ucMark == pucImg[usCheckIndex] ) + { + pucImg[usCheckIndex] = 0; + pusSearchList[usIndexAdd++] = usCheckIndex; + } + } + if( ucHeight > (ucY + 1) ) + { + USHORT usCheckIndex = (ucX-1) + (ucY+1) * ucWidth; + if( ucMark == pucImg[usCheckIndex] ) + { + pucImg[usCheckIndex] = 0; + pusSearchList[usIndexAdd++] = usCheckIndex; + } + } + } + if( ucWidth > (ucX + 1) ) + { + { + USHORT usCheckIndex = (ucX+1) + (ucY ) * ucWidth; + if( ucMark == pucImg[usCheckIndex] ) + { + pucImg[usCheckIndex] = 0; + pusSearchList[usIndexAdd++] = usCheckIndex; + } + } + if( 0 <= (ucY - 1) ) + { + USHORT usCheckIndex = (ucX+1) + (ucY-1) * ucWidth; + if( ucMark == pucImg[usCheckIndex] ) + { + pucImg[usCheckIndex] = 0; + pusSearchList[usIndexAdd++] = usCheckIndex; + } + } + if( ucHeight > (ucY + 1) ) + { + USHORT usCheckIndex = (ucX+1) + (ucY+1) * ucWidth; + if( ucMark == pucImg[usCheckIndex] ) + { + pucImg[usCheckIndex] = 0; + pusSearchList[usIndexAdd++] = usCheckIndex; + } + } + } + usIndex++; + } + + if( usIndex <= usArea ) + { + ucLabelNum = 0; + } + else + { + ucDetectNum++; + ucLabelNum = ucDetectNum; + } + + { + USHORT usImg2 = 0; + for( usImg2 = 0; usImg2 < usIndex; usImg2++ ) + { + pucImg[ pusSearchList[usImg2] ] = ucLabelNum; + } + } + } + + return( ucDetectNum ); +} + +/*------------------------------------------------------------------------------ + Calculate features. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_FEA_CalcArea( USHORT usSize, UCHAR ucLabelNo, UCHAR* pucImg, USHORT* pusRet ) +{ + BOOL bRet = FALSE; + USHORT usImg = 0; + USHORT usArea = 0; + + for( usImg = 0; usImg < usSize; usImg++ ) + { + if( ucLabelNo == pucImg[usImg] ) + { + bRet = TRUE; + usArea++; + } + } + + if( FALSE != bRet ) + { + *pusRet = usArea; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Calculate features. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_FEA_CalcRectangle( UCHAR ucWidth, UCHAR ucHeight, UCHAR ucLabelNo, UCHAR* pucImg, UCHAR* pucRet ) +{ + BOOL bRet = FALSE; + USHORT usImg = 0; + USHORT usSize = ucWidth * ucHeight; + UCHAR ucMinX = ucWidth - 1; + UCHAR ucMinY = ucHeight - 1; + UCHAR ucMaxX = 0; + UCHAR ucMaxY = 0; + + for( usImg = 0; usImg < usSize; usImg++ ) + { + UCHAR ucImgX = usImg % ucWidth; + UCHAR ucImgY = usImg / ucWidth; + + if( ucLabelNo == pucImg[usImg] ) + { + bRet = TRUE; + if( ucMinX > ucImgX ) + { + ucMinX = ucImgX; + } + if( ucMinY > ucImgY ) + { + ucMinY = ucImgY; + } + if( ucMaxX < ucImgX ) + { + ucMaxX = ucImgX; + } + if( ucMaxY < ucImgY ) + { + ucMaxY = ucImgY; + } + } + } + + if( FALSE != bRet ) + { + pucRet[0] = ucMinX; + pucRet[1] = ucMinY; + pucRet[2] = ucMaxX; + pucRet[3] = ucMaxY; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Calculate features. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_FEA_CalcMinTemp( USHORT usSize, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, short* pshRet ) +{ + BOOL bRet = FALSE; + USHORT usImg = 0; + short shMin = SHORT_MAX_VAL; + + for( usImg = 0; usImg < usSize; usImg++ ) + { + if( ucLabelNo == pucImg[usImg] ) + { + bRet = TRUE; + if( shMin > pshImg[usImg] ) + { + shMin = pshImg[usImg]; + } + } + } + + if( FALSE != bRet ) + { + *pshRet = shMin; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Calculate features. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_FEA_CalcMaxTemp( USHORT usSize, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, short* pshRet ) +{ + BOOL bRet = FALSE; + USHORT usImg = 0; + short shMax = SHORT_MIN_VAL; + + for( usImg = 0; usImg < usSize; usImg++ ) + { + if( ucLabelNo == pucImg[usImg] ) + { + bRet = TRUE; + if( shMax < pshImg[usImg] ) + { + shMax = pshImg[usImg]; + } + } + } + + if( FALSE != bRet ) + { + *pshRet = shMax; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Calculate features. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_FEA_CalcAveTemp( USHORT usSize, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, short* pshRet ) +{ + BOOL bRet = FALSE; + USHORT usImg = 0; + long loSum = 0; + USHORT usCnt = 0; + + for( usImg = 0; usImg < usSize; usImg++ ) + { + if( ucLabelNo == pucImg[usImg] ) + { + bRet = TRUE; + loSum += pshImg[usImg]; + usCnt++; + } + } + + if( FALSE != bRet ) + { + *pshRet = (short)( loSum / usCnt ); + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Calculate features. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_FEA_CalcStdDevTemp( USHORT usSize, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, USHORT* pusRet ) +{ + BOOL bRet = FALSE; + USHORT usImg = 0; + ULONG ulS = 0; + USHORT usCnt = 0; + short shAve = 0; + + if( FALSE != bAMG_PUB_FEA_CalcAveTemp( usSize, ucLabelNo, pucImg, pshImg, &shAve ) ) + { + bRet = TRUE; + for( usImg = 0; usImg < usSize; usImg++ ) + { + if( ucLabelNo == pucImg[usImg] ) + { + ULONG ulPow = (ULONG)( (long)(pshImg[usImg] - shAve) * (pshImg[usImg] - shAve) ); + if( (ULONG_MAX_VAL - ulS) < ulPow ) + { + bRet = FALSE; + } + else + { + ulS += ulPow; + usCnt++; + } + } + } + } + + if( FALSE != bRet ) + { + ULONG ulData = ulS / usCnt; + ULONG ulWork = ( 1 < ulData ) ? ulData : 1; + ULONG ulSqrt = 0; + if( 0 != ulData ) + { + do + { + ulSqrt = ulWork; + ulWork = (ulData / ulWork + ulWork) >> 1; + } + while( ulWork < ulSqrt ); + } + *pusRet = (USHORT)ulSqrt; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Calculate features. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_FEA_CalcStdDevTemp_f( USHORT usSize, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, float* pfRet ) +{ + BOOL bRet = FALSE; + USHORT usImg = 0; + float fS = 0; + USHORT usCnt = 0; + short shAve = 0; + + if( FALSE != bAMG_PUB_FEA_CalcAveTemp( usSize, ucLabelNo, pucImg, pshImg, &shAve ) ) + { + bRet = TRUE; + for( usImg = 0; usImg < usSize; usImg++ ) + { + if( ucLabelNo == pucImg[usImg] ) + { + float fDiff = fAMG_PUB_CMN_ConvStoF(pshImg[usImg] - shAve); + fS += fDiff * fDiff; + usCnt++; + } + } + } + + if( FALSE != bRet ) + { + float fData = fS / usCnt; + float fWork = ( 1 < fData ) ? fData : 1; + float fSqrt = 0; + if( 0 < fData ) + { + do + { + fSqrt = fWork; + fWork = (fData / fWork + fWork) * 0.5f; + } + while( fWork < fSqrt ); + } + *pfRet = fSqrt; + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Calculate features. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_FEA_CalcCenterTemp( UCHAR ucWidth, UCHAR ucHeight, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, short* pshRet ) +{ + BOOL bRet = FALSE; + USHORT usImg = 0; + USHORT usSize = ucWidth * ucHeight; + short shMin = SHORT_MAX_VAL; + ULONG ulGx = 0; + ULONG ulGy = 0; + ULONG ulGw = 0; + + if( FALSE != bAMG_PUB_FEA_CalcMinTemp( usSize, ucLabelNo, pucImg, pshImg, &shMin ) ) + { + shMin -= 1; + bRet = TRUE; + } + if( FALSE != bRet ) + { + for( usImg = 0; usImg < usSize; usImg++ ) + { + if( ucLabelNo == pucImg[usImg] ) + { + UCHAR ucImgX = usImg % ucWidth; + UCHAR ucImgY = usImg / ucWidth; + ULONG ulWeight = (ULONG)( pshImg[usImg] - shMin ); + ulGx += ulWeight * (ucImgX + 1); + ulGy += ulWeight * (ucImgY + 1); + ulGw += ulWeight; + } + } + + if( 0 < ulGw ) + { + pshRet[0] = ulGx * 256 / ulGw - 256; + pshRet[1] = ulGy * 256 / ulGw - 256; + } + else + { + pshRet[0] = 0; + pshRet[1] = 0; + } + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Calculate features. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_FEA_CalcCenterTemp_f( UCHAR ucWidth, UCHAR ucHeight, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, float* pfRet ) +{ + BOOL bRet = FALSE; + USHORT usImg = 0; + USHORT usSize = ucWidth * ucHeight; + short shMin = SHORT_MAX_VAL; + short shMax = SHORT_MIN_VAL; + short shDiff = 0; + float fGx = 0; + float fGy = 0; + float fGw = 0; + + if( FALSE != bAMG_PUB_FEA_CalcMinTemp( usSize, ucLabelNo, pucImg, pshImg, &shMin ) ) + { + shMin -= 1; + if( FALSE != bAMG_PUB_FEA_CalcMaxTemp( usSize, ucLabelNo, pucImg, pshImg, &shMax ) ) + { + bRet = TRUE; + } + } + if( FALSE != bRet ) + { + shDiff = shMax - shMin; + for( usImg = 0; usImg < usSize; usImg++ ) + { + if( ucLabelNo == pucImg[usImg] ) + { + UCHAR ucImgX = usImg % ucWidth; + UCHAR ucImgY = usImg / ucWidth; + float fWeight = (float)( pshImg[usImg] - shMin ) / shDiff; + fGx += fWeight * (ucImgX + 1); + fGy += fWeight * (ucImgY + 1); + fGw += fWeight; + } + } + + if( 0 < fGw ) + { + pfRet[0] = fGx / fGw - 1; + pfRet[1] = fGy / fGw - 1; + } + else + { + pfRet[0] = 0; + pfRet[1] = 0; + } + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Update background temperature. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_BGT_UpdateBackTemp( USHORT usSize, UCHAR* pucImg, short* pshDiffImg, short shTh, short* pshBackImg ) +{ + const short c_shMinTh = 0; + const short c_shMaxTh = 256; + BOOL bRet = FALSE; + USHORT usImg = 0; + short shAve = 0; + + /* Adjust parameter. */ + if( c_shMinTh > shTh ) + { + shTh = c_shMinTh; + } + if( c_shMaxTh < shTh ) + { + shTh = c_shMaxTh; + } + + if( FALSE != bAMG_PUB_FEA_CalcAveTemp( usSize, 0, pucImg, pshDiffImg, &shAve ) ) + { + bRet = TRUE; + for( usImg = 0; usImg < usSize; usImg++ ) + { + short shTemp = 0; + if( 0 == pucImg[usImg] ) + { + shTemp = (short)( (long)shTh * pshDiffImg[usImg] / c_shMaxTh ); + } + else + { + shTemp = (short)( (long)shTh * shAve / c_shMaxTh ); + } + pshBackImg[usImg] += shTemp; + } + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Judge human. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_HDT_JudgeHuman( USHORT usSize, USHORT usTh ) +{ + return( ( usTh < usSize ) ? TRUE : FALSE ); +} + +/*------------------------------------------------------------------------------ + Output. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_OUT_CalcOutImage( UCHAR ucImgWidth, UCHAR ucImgHeight, UCHAR ucOutWidth, UCHAR ucOutHeight, short* pshCenter, UCHAR* pucCenter ) +{ + BOOL bRet = FALSE; + + if( (0 <= pshCenter[0]) && ((ucImgWidth-1) >= (pshCenter[0]/256)) ) + { + if( (0 <= pshCenter[1]) && ((ucImgHeight-1) >= (pshCenter[1]/256)) ) + { + bRet = TRUE; + pucCenter[0] = (UCHAR)( (long)pshCenter[0] * ucOutWidth / ((long)ucImgWidth * 256) ); + pucCenter[1] = (UCHAR)( (long)pshCenter[1] * ucOutHeight / ((long)ucImgHeight * 256) ); + } + } + + return( bRet ); +} + +/*------------------------------------------------------------------------------ + Output. +------------------------------------------------------------------------------*/ +BOOL bAMG_PUB_OUT_CalcOutImage_f( UCHAR ucImgWidth, UCHAR ucImgHeight, UCHAR ucOutWidth, UCHAR ucOutHeight, float* pfCenter, UCHAR* pucCenter ) +{ + BOOL bRet = FALSE; + + if( (0 <= pfCenter[0]) && ((ucImgWidth-1) >= pfCenter[0]) ) + { + if( (0 <= pfCenter[1]) && ((ucImgHeight-1) >= pfCenter[1]) ) + { + bRet = TRUE; + pucCenter[0] = (UCHAR)( pfCenter[0] * ucOutWidth / (float)ucImgWidth ); + pucCenter[1] = (UCHAR)( pfCenter[1] * ucOutHeight / (float)ucImgHeight ); + } + } + + return( bRet ); +} +