Library for MAXREFDES131 OneWire GridEYE sensor interface

Dependents:   MAXREFDES131_Qt_Demo MAXREFDES130_131_Demo

Committer:
j3
Date:
Thu Jun 16 18:09:15 2016 +0000
Revision:
8:fa89d4cd41cd
Parent:
3:5b025369ad96
Child:
12:4b7ac3b21d91
Fixed includes for porting to Arduino later

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 1:9e457e35e2e3 1 /*******************************************************************************
j3 1:9e457e35e2e3 2 include file
j3 1:9e457e35e2e3 3 *******************************************************************************/
j3 8:fa89d4cd41cd 4 #include "API_Level_2/grideye_api_lv2.h"
j3 1:9e457e35e2e3 5
j3 1:9e457e35e2e3 6
j3 1:9e457e35e2e3 7 /*******************************************************************************
j3 1:9e457e35e2e3 8 macro definition
j3 1:9e457e35e2e3 9 *******************************************************************************/
j3 1:9e457e35e2e3 10 #define TRUE (1)
j3 1:9e457e35e2e3 11 #define FALSE (0)
j3 1:9e457e35e2e3 12
j3 1:9e457e35e2e3 13 #define SHORT_MAX_VAL ( 32767) /* 0x7FFF */
j3 1:9e457e35e2e3 14 #define SHORT_MIN_VAL (-32768) /* 0x8000 */
j3 1:9e457e35e2e3 15 #define ULONG_MAX_VAL ( 4294967295) /* 0xFFFFFFFF */
j3 1:9e457e35e2e3 16
j3 1:9e457e35e2e3 17 /* Grid-EYE's number of pixels */
j3 1:9e457e35e2e3 18 #define SNR_SZ_X (8)
j3 1:9e457e35e2e3 19 #define SNR_SZ_Y (8)
j3 1:9e457e35e2e3 20 #define SNR_SZ (SNR_SZ_X * SNR_SZ_Y)
j3 1:9e457e35e2e3 21
j3 1:9e457e35e2e3 22
j3 1:9e457e35e2e3 23 /*******************************************************************************
j3 1:9e457e35e2e3 24 public method
j3 1:9e457e35e2e3 25 ******************************************************************************/
j3 1:9e457e35e2e3 26
j3 1:9e457e35e2e3 27 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 28 Calculate average.
j3 1:9e457e35e2e3 29 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 30 short shAMG_PUB_CMN_CalcAve( short* pshArray, USHORT usSize, UCHAR ucSkip, UCHAR ucMedian, BOOL* pbMedianWork )
j3 1:9e457e35e2e3 31 {
j3 1:9e457e35e2e3 32 short shAve = 0;
j3 1:9e457e35e2e3 33
j3 1:9e457e35e2e3 34 if( 1 >= usSize )
j3 1:9e457e35e2e3 35 {
j3 1:9e457e35e2e3 36 return( *pshArray );
j3 1:9e457e35e2e3 37 }
j3 1:9e457e35e2e3 38
j3 1:9e457e35e2e3 39 /* Adjust parameter. */
j3 1:9e457e35e2e3 40 if( 1 > ucSkip )
j3 1:9e457e35e2e3 41 {
j3 1:9e457e35e2e3 42 ucSkip = 1;
j3 1:9e457e35e2e3 43 }
j3 1:9e457e35e2e3 44 if( ucMedian > ((usSize - 1) / 2) )
j3 1:9e457e35e2e3 45 {
j3 1:9e457e35e2e3 46 ucMedian = ((usSize - 1) / 2);
j3 1:9e457e35e2e3 47 }
j3 1:9e457e35e2e3 48
j3 1:9e457e35e2e3 49 /* Calculate average. */
j3 1:9e457e35e2e3 50 if( 0 == ucMedian )
j3 1:9e457e35e2e3 51 {
j3 1:9e457e35e2e3 52 USHORT usCnt = 0;
j3 1:9e457e35e2e3 53 long loSum = 0;
j3 1:9e457e35e2e3 54
j3 1:9e457e35e2e3 55 for( usCnt = 0; usCnt < usSize; usCnt++ )
j3 1:9e457e35e2e3 56 {
j3 1:9e457e35e2e3 57 short shCurData = pshArray[usCnt * ucSkip];
j3 1:9e457e35e2e3 58 loSum += shCurData;
j3 1:9e457e35e2e3 59 }
j3 1:9e457e35e2e3 60 shAve = (short)(loSum / usSize);
j3 1:9e457e35e2e3 61 }
j3 1:9e457e35e2e3 62 else
j3 1:9e457e35e2e3 63 {
j3 1:9e457e35e2e3 64 USHORT usCnt = 0;
j3 1:9e457e35e2e3 65 long loSum = 0;
j3 1:9e457e35e2e3 66 UCHAR ucMedianCnt = 0;
j3 1:9e457e35e2e3 67
j3 1:9e457e35e2e3 68 for( usCnt = 0; usCnt < usSize; usCnt++ )
j3 1:9e457e35e2e3 69 {
j3 1:9e457e35e2e3 70 pbMedianWork[usCnt] = TRUE;
j3 1:9e457e35e2e3 71 }
j3 1:9e457e35e2e3 72
j3 1:9e457e35e2e3 73 for( ucMedianCnt = 0; ucMedianCnt < ucMedian; ucMedianCnt++ )
j3 1:9e457e35e2e3 74 {
j3 1:9e457e35e2e3 75 short shMaxData = SHORT_MIN_VAL;
j3 1:9e457e35e2e3 76 short shMinData = SHORT_MAX_VAL;
j3 1:9e457e35e2e3 77 UCHAR ucIndex = 0;
j3 1:9e457e35e2e3 78
j3 1:9e457e35e2e3 79 for( usCnt = 0; usCnt < usSize; usCnt++ )
j3 1:9e457e35e2e3 80 {
j3 1:9e457e35e2e3 81 if( FALSE != pbMedianWork[usCnt] )
j3 1:9e457e35e2e3 82 {
j3 1:9e457e35e2e3 83 short shCurData = pshArray[usCnt * ucSkip];
j3 1:9e457e35e2e3 84 if( shMaxData < shCurData )
j3 1:9e457e35e2e3 85 {
j3 1:9e457e35e2e3 86 shMaxData = shCurData;
j3 1:9e457e35e2e3 87 ucIndex = usCnt;
j3 1:9e457e35e2e3 88 }
j3 1:9e457e35e2e3 89 }
j3 1:9e457e35e2e3 90 }
j3 1:9e457e35e2e3 91 pbMedianWork[ucIndex] = FALSE;
j3 1:9e457e35e2e3 92
j3 1:9e457e35e2e3 93 for( usCnt = 0; usCnt < usSize; usCnt++ )
j3 1:9e457e35e2e3 94 {
j3 1:9e457e35e2e3 95 if( FALSE != pbMedianWork[usCnt] )
j3 1:9e457e35e2e3 96 {
j3 1:9e457e35e2e3 97 short shCurData = pshArray[usCnt * ucSkip];
j3 1:9e457e35e2e3 98 if( shMinData > shCurData )
j3 1:9e457e35e2e3 99 {
j3 1:9e457e35e2e3 100 shMinData = shCurData;
j3 1:9e457e35e2e3 101 ucIndex = usCnt;
j3 1:9e457e35e2e3 102 }
j3 1:9e457e35e2e3 103 }
j3 1:9e457e35e2e3 104 }
j3 1:9e457e35e2e3 105 pbMedianWork[ucIndex] = FALSE;
j3 1:9e457e35e2e3 106 }
j3 1:9e457e35e2e3 107
j3 1:9e457e35e2e3 108 for( usCnt = 0; usCnt < usSize; usCnt++ )
j3 1:9e457e35e2e3 109 {
j3 1:9e457e35e2e3 110 short shCurData = pshArray[usCnt * ucSkip];
j3 1:9e457e35e2e3 111 if( FALSE != pbMedianWork[usCnt] )
j3 1:9e457e35e2e3 112 {
j3 1:9e457e35e2e3 113 loSum += shCurData;
j3 1:9e457e35e2e3 114 }
j3 1:9e457e35e2e3 115 }
j3 1:9e457e35e2e3 116 shAve = (short)(loSum / ( usSize - ucMedian * 2 ));
j3 1:9e457e35e2e3 117 }
j3 1:9e457e35e2e3 118
j3 1:9e457e35e2e3 119 return( shAve );
j3 1:9e457e35e2e3 120 }
j3 1:9e457e35e2e3 121
j3 1:9e457e35e2e3 122 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 123 Calculate average.
j3 1:9e457e35e2e3 124 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 125 short shAMG_PUB_CMN_CalcIIR( short shVal1, short shVal2, short shTh )
j3 1:9e457e35e2e3 126 {
j3 1:9e457e35e2e3 127 const short c_shMinTh = 0;
j3 1:9e457e35e2e3 128 const short c_shMaxTh = 256;
j3 1:9e457e35e2e3 129 long loAddVal = 0;
j3 1:9e457e35e2e3 130
j3 1:9e457e35e2e3 131 /* Adjust parameter. */
j3 1:9e457e35e2e3 132 if( c_shMinTh > shTh )
j3 1:9e457e35e2e3 133 {
j3 1:9e457e35e2e3 134 shTh = c_shMinTh;
j3 1:9e457e35e2e3 135 }
j3 1:9e457e35e2e3 136 if( c_shMaxTh < shTh )
j3 1:9e457e35e2e3 137 {
j3 1:9e457e35e2e3 138 shTh = c_shMaxTh;
j3 1:9e457e35e2e3 139 }
j3 1:9e457e35e2e3 140
j3 1:9e457e35e2e3 141 /* Calculate average. */
j3 1:9e457e35e2e3 142 loAddVal = (long)shTh * ( shVal2 - shVal1 );
j3 1:9e457e35e2e3 143 return( shVal1 + (short)(loAddVal / c_shMaxTh) );
j3 1:9e457e35e2e3 144 }
j3 1:9e457e35e2e3 145
j3 1:9e457e35e2e3 146 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 147 Calculate average.
j3 1:9e457e35e2e3 148 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 149 short shAMG_PUB_CMN_CalcIIR_f( short shVal1, short shVal2, float fTh )
j3 1:9e457e35e2e3 150 {
j3 1:9e457e35e2e3 151 const float c_fMinTh = 0;
j3 1:9e457e35e2e3 152 const float c_fMaxTh = 1;
j3 1:9e457e35e2e3 153 float fAddVal = 0;
j3 1:9e457e35e2e3 154
j3 1:9e457e35e2e3 155 /* Adjust parameter. */
j3 1:9e457e35e2e3 156 if( c_fMinTh > fTh )
j3 1:9e457e35e2e3 157 {
j3 1:9e457e35e2e3 158 fTh = c_fMinTh;
j3 1:9e457e35e2e3 159 }
j3 1:9e457e35e2e3 160 if( c_fMaxTh < fTh )
j3 1:9e457e35e2e3 161 {
j3 1:9e457e35e2e3 162 fTh = c_fMaxTh;
j3 1:9e457e35e2e3 163 }
j3 1:9e457e35e2e3 164 /* Calculate average. */
j3 1:9e457e35e2e3 165 fAddVal = fTh * ( shVal2 - shVal1 );
j3 1:9e457e35e2e3 166 return( shVal1 + (short)fAddVal );
j3 1:9e457e35e2e3 167 }
j3 1:9e457e35e2e3 168
j3 1:9e457e35e2e3 169 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 170 Convert image : ( x, y ) -> ( ucWidth-1-x , y )
j3 1:9e457e35e2e3 171 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 172 void vAMG_PUB_IMG_ConvertFlipX( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg )
j3 1:9e457e35e2e3 173 {
j3 1:9e457e35e2e3 174 {
j3 1:9e457e35e2e3 175 UCHAR ucX = 0;
j3 1:9e457e35e2e3 176 UCHAR ucY = 0;
j3 1:9e457e35e2e3 177 for( ucY = 0; ucY < ucHeight; ucY++ )
j3 1:9e457e35e2e3 178 {
j3 1:9e457e35e2e3 179 for( ucX = 0; ucX < (ucWidth+1)/2; ucX++ )
j3 1:9e457e35e2e3 180 {
j3 1:9e457e35e2e3 181 USHORT usIndex1 = (USHORT)( ucX) + ucY * ucWidth;
j3 1:9e457e35e2e3 182 USHORT usIndex2 = (USHORT)(ucWidth - 1 - ucX) + ucY * ucWidth;
j3 1:9e457e35e2e3 183 short shVal = pshInImg[usIndex1];
j3 1:9e457e35e2e3 184 pshOutImg[usIndex1] = pshInImg[usIndex2];
j3 1:9e457e35e2e3 185 pshOutImg[usIndex2] = shVal;
j3 1:9e457e35e2e3 186 }
j3 1:9e457e35e2e3 187 }
j3 1:9e457e35e2e3 188 }
j3 1:9e457e35e2e3 189 }
j3 1:9e457e35e2e3 190
j3 1:9e457e35e2e3 191 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 192 Convert image : ( x, y ) -> ( x, ucHeight-1-y )
j3 1:9e457e35e2e3 193 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 194 void vAMG_PUB_IMG_ConvertFlipY( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg )
j3 1:9e457e35e2e3 195 {
j3 1:9e457e35e2e3 196 {
j3 1:9e457e35e2e3 197 UCHAR ucX = 0;
j3 1:9e457e35e2e3 198 UCHAR ucY = 0;
j3 1:9e457e35e2e3 199 for( ucY = 0; ucY < (ucHeight+1)/2; ucY++ )
j3 1:9e457e35e2e3 200 {
j3 1:9e457e35e2e3 201 for( ucX = 0; ucX < ucWidth; ucX++ )
j3 1:9e457e35e2e3 202 {
j3 1:9e457e35e2e3 203 USHORT usIndex1 = (USHORT)ucX + ( ucY) * ucWidth;
j3 1:9e457e35e2e3 204 USHORT usIndex2 = (USHORT)ucX + (ucHeight - 1 - ucY) * ucWidth;
j3 1:9e457e35e2e3 205 short shVal = pshInImg[usIndex1];
j3 1:9e457e35e2e3 206 pshOutImg[usIndex1] = pshInImg[usIndex2];
j3 1:9e457e35e2e3 207 pshOutImg[usIndex2] = shVal;
j3 1:9e457e35e2e3 208 }
j3 1:9e457e35e2e3 209 }
j3 1:9e457e35e2e3 210 }
j3 1:9e457e35e2e3 211 }
j3 1:9e457e35e2e3 212
j3 1:9e457e35e2e3 213 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 214 Convert image : ( x, y ) -> ( y, x )
j3 1:9e457e35e2e3 215 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 216 BOOL bAMG_PUB_IMG_ConvertFlipXY( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg )
j3 1:9e457e35e2e3 217 {
j3 1:9e457e35e2e3 218 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 219
j3 1:9e457e35e2e3 220 if( ucWidth == ucHeight )
j3 1:9e457e35e2e3 221 {
j3 1:9e457e35e2e3 222 UCHAR ucX = 0;
j3 1:9e457e35e2e3 223 UCHAR ucY = 0;
j3 1:9e457e35e2e3 224 for( ucY = 0; ucY < ucHeight; ucY++ )
j3 1:9e457e35e2e3 225 {
j3 1:9e457e35e2e3 226 for( ucX = ucY; ucX < ucWidth; ucX++ )
j3 1:9e457e35e2e3 227 {
j3 1:9e457e35e2e3 228 USHORT usIndex1 = (USHORT)ucX + ucY * ucWidth;
j3 1:9e457e35e2e3 229 USHORT usIndex2 = (USHORT)ucY + ucX * ucWidth;
j3 1:9e457e35e2e3 230 short shVal = pshInImg[usIndex1];
j3 1:9e457e35e2e3 231 pshOutImg[usIndex1] = pshInImg[usIndex2];
j3 1:9e457e35e2e3 232 pshOutImg[usIndex2] = shVal;
j3 1:9e457e35e2e3 233 }
j3 1:9e457e35e2e3 234 }
j3 1:9e457e35e2e3 235 bRet = TRUE;
j3 1:9e457e35e2e3 236 }
j3 1:9e457e35e2e3 237
j3 1:9e457e35e2e3 238 return( bRet );
j3 1:9e457e35e2e3 239 }
j3 1:9e457e35e2e3 240
j3 1:9e457e35e2e3 241 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 242 Convert image : ( x, y ) -> ( ucHeight-1-y, x )
j3 1:9e457e35e2e3 243 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 244 BOOL bAMG_PUB_IMG_ConvertRotate90( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg )
j3 1:9e457e35e2e3 245 {
j3 1:9e457e35e2e3 246 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 247
j3 1:9e457e35e2e3 248 if( ucWidth == ucHeight )
j3 1:9e457e35e2e3 249 {
j3 1:9e457e35e2e3 250 UCHAR ucX = 0;
j3 1:9e457e35e2e3 251 UCHAR ucY = 0;
j3 1:9e457e35e2e3 252 for( ucY = 0; ucY < (ucHeight+1)/2; ucY++ )
j3 1:9e457e35e2e3 253 {
j3 1:9e457e35e2e3 254 for( ucX = ucY; ucX < ucWidth - ucY - 1; ucX++ )
j3 1:9e457e35e2e3 255 {
j3 1:9e457e35e2e3 256 USHORT usIndex1 = (USHORT)( ucX) + ( ucY) * ucWidth;
j3 1:9e457e35e2e3 257 USHORT usIndex2 = (USHORT)( ucY) + (ucWidth - 1 - ucX) * ucWidth;
j3 1:9e457e35e2e3 258 USHORT usIndex3 = (USHORT)(ucWidth - 1 - ucX) + (ucWidth - 1 - ucY) * ucWidth;
j3 1:9e457e35e2e3 259 USHORT usIndex4 = (USHORT)(ucWidth - 1 - ucY) + ( ucX) * ucWidth;
j3 1:9e457e35e2e3 260 short shVal = pshInImg[usIndex1];
j3 1:9e457e35e2e3 261 pshOutImg[usIndex1] = pshInImg[usIndex2];
j3 1:9e457e35e2e3 262 pshOutImg[usIndex2] = pshInImg[usIndex3];
j3 1:9e457e35e2e3 263 pshOutImg[usIndex3] = pshInImg[usIndex4];
j3 1:9e457e35e2e3 264 pshOutImg[usIndex4] = shVal;
j3 1:9e457e35e2e3 265 }
j3 1:9e457e35e2e3 266 if( ucX == ucY )
j3 1:9e457e35e2e3 267 {
j3 1:9e457e35e2e3 268 USHORT usIndex = (USHORT)ucX + ucY * ucWidth;
j3 1:9e457e35e2e3 269 pshOutImg[usIndex] = pshInImg[usIndex];
j3 1:9e457e35e2e3 270 }
j3 1:9e457e35e2e3 271 }
j3 1:9e457e35e2e3 272
j3 1:9e457e35e2e3 273 bRet = TRUE;
j3 1:9e457e35e2e3 274 }
j3 1:9e457e35e2e3 275
j3 1:9e457e35e2e3 276 return( bRet );
j3 1:9e457e35e2e3 277 }
j3 1:9e457e35e2e3 278
j3 1:9e457e35e2e3 279 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 280 Convert image : ( x, y ) -> ( ucWidth-1-x, ucHeight-1-y )
j3 1:9e457e35e2e3 281 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 282 void vAMG_PUB_IMG_ConvertRotate180( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg )
j3 1:9e457e35e2e3 283 {
j3 1:9e457e35e2e3 284 USHORT usSize = ucWidth * ucHeight;
j3 1:9e457e35e2e3 285 USHORT usIndex1 = 0;
j3 1:9e457e35e2e3 286
j3 1:9e457e35e2e3 287 for( usIndex1 = 0; usIndex1 < (usSize+1)/2; usIndex1++ )
j3 1:9e457e35e2e3 288 {
j3 1:9e457e35e2e3 289 USHORT usIndex2 = usSize - 1 - usIndex1;
j3 1:9e457e35e2e3 290 short shVal = pshInImg[usIndex1];
j3 1:9e457e35e2e3 291 pshOutImg[usIndex1] = pshInImg[usIndex2];
j3 1:9e457e35e2e3 292 pshOutImg[usIndex2] = shVal;
j3 1:9e457e35e2e3 293 }
j3 1:9e457e35e2e3 294 }
j3 1:9e457e35e2e3 295
j3 1:9e457e35e2e3 296 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 297 Convert image : ( x, y ) -> ( y, ucWidth-1-x )
j3 1:9e457e35e2e3 298 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 299 BOOL bAMG_PUB_IMG_ConvertRotate270( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg )
j3 1:9e457e35e2e3 300 {
j3 1:9e457e35e2e3 301 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 302
j3 1:9e457e35e2e3 303 if( ucWidth == ucHeight )
j3 1:9e457e35e2e3 304 {
j3 1:9e457e35e2e3 305 UCHAR ucX = 0;
j3 1:9e457e35e2e3 306 UCHAR ucY = 0;
j3 1:9e457e35e2e3 307 for( ucY = 0; ucY < (ucHeight+1)/2; ucY++ )
j3 1:9e457e35e2e3 308 {
j3 1:9e457e35e2e3 309 for( ucX = ucY; ucX < ucWidth - ucY - 1; ucX++ )
j3 1:9e457e35e2e3 310 {
j3 1:9e457e35e2e3 311 USHORT usIndex1 = (USHORT)( ucX) + ( ucY) * ucWidth;
j3 1:9e457e35e2e3 312 USHORT usIndex2 = (USHORT)(ucWidth - 1 - ucY) + ( ucX) * ucWidth;
j3 1:9e457e35e2e3 313 USHORT usIndex3 = (USHORT)(ucWidth - 1 - ucX) + (ucWidth - 1 - ucY) * ucWidth;
j3 1:9e457e35e2e3 314 USHORT usIndex4 = (USHORT)( ucY) + (ucWidth - 1 - ucX) * ucWidth;
j3 1:9e457e35e2e3 315 short shVal = pshInImg[usIndex1];
j3 1:9e457e35e2e3 316 pshOutImg[usIndex1] = pshInImg[usIndex2];
j3 1:9e457e35e2e3 317 pshOutImg[usIndex2] = pshInImg[usIndex3];
j3 1:9e457e35e2e3 318 pshOutImg[usIndex3] = pshInImg[usIndex4];
j3 1:9e457e35e2e3 319 pshOutImg[usIndex4] = shVal;
j3 1:9e457e35e2e3 320 }
j3 1:9e457e35e2e3 321 if( ucX == ucY )
j3 1:9e457e35e2e3 322 {
j3 1:9e457e35e2e3 323 USHORT usIndex = (USHORT)ucX + ucY * ucWidth;
j3 1:9e457e35e2e3 324 pshOutImg[usIndex] = pshInImg[usIndex];
j3 1:9e457e35e2e3 325 }
j3 1:9e457e35e2e3 326 }
j3 1:9e457e35e2e3 327
j3 1:9e457e35e2e3 328 bRet = TRUE;
j3 1:9e457e35e2e3 329 }
j3 1:9e457e35e2e3 330
j3 1:9e457e35e2e3 331 return( bRet );
j3 1:9e457e35e2e3 332 }
j3 1:9e457e35e2e3 333
j3 1:9e457e35e2e3 334 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 335 Linear interpolation : 8 x 8 -> 15 x 15
j3 1:9e457e35e2e3 336 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 337 BOOL bAMG_PUB_IMG_LinearInterpolationSQ15( short* pshInImg, short* pshOutImg )
j3 1:9e457e35e2e3 338 {
j3 1:9e457e35e2e3 339 const UCHAR c_ucImgWidth = 15;
j3 1:9e457e35e2e3 340 const UCHAR c_ucImgHeight = 15;
j3 1:9e457e35e2e3 341 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 342
j3 1:9e457e35e2e3 343 if( pshInImg != pshOutImg )
j3 1:9e457e35e2e3 344 {
j3 1:9e457e35e2e3 345 UCHAR ucX = 0;
j3 1:9e457e35e2e3 346 UCHAR ucY = 0;
j3 1:9e457e35e2e3 347 for( ucY = 0; ucY < c_ucImgHeight; ucY += 2 )
j3 1:9e457e35e2e3 348 {
j3 1:9e457e35e2e3 349 for( ucX = 0; ucX < c_ucImgWidth; ucX += 2 )
j3 1:9e457e35e2e3 350 {
j3 1:9e457e35e2e3 351 UCHAR ucSnr = ucX / 2 + ucY / 2 * SNR_SZ_X;
j3 1:9e457e35e2e3 352 UCHAR ucImg = ucX + ucY * c_ucImgWidth;
j3 1:9e457e35e2e3 353 pshOutImg[ucImg] = pshInImg[ucSnr];
j3 1:9e457e35e2e3 354 }
j3 1:9e457e35e2e3 355 for( ucX = 1; ucX < c_ucImgWidth; ucX += 2 )
j3 1:9e457e35e2e3 356 {
j3 1:9e457e35e2e3 357 UCHAR ucImg = ucX + ucY * c_ucImgWidth;
j3 1:9e457e35e2e3 358 pshOutImg[ucImg] = ( pshOutImg[ucImg-1] + pshOutImg[ucImg+1] ) / 2;
j3 1:9e457e35e2e3 359 }
j3 1:9e457e35e2e3 360 }
j3 1:9e457e35e2e3 361 for( ucY = 1; ucY < c_ucImgHeight; ucY += 2 )
j3 1:9e457e35e2e3 362 {
j3 1:9e457e35e2e3 363 for( ucX = 0; ucX < c_ucImgWidth; ucX++ )
j3 1:9e457e35e2e3 364 {
j3 1:9e457e35e2e3 365 UCHAR ucImg = ucX + ucY * c_ucImgWidth;
j3 1:9e457e35e2e3 366 pshOutImg[ucImg] = ( pshOutImg[ucImg-c_ucImgWidth] + pshOutImg[ucImg+c_ucImgWidth] ) / 2;
j3 1:9e457e35e2e3 367 }
j3 1:9e457e35e2e3 368 }
j3 1:9e457e35e2e3 369
j3 1:9e457e35e2e3 370 bRet = TRUE;
j3 1:9e457e35e2e3 371 }
j3 1:9e457e35e2e3 372
j3 1:9e457e35e2e3 373 return( bRet );
j3 1:9e457e35e2e3 374 }
j3 1:9e457e35e2e3 375
j3 1:9e457e35e2e3 376 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 377 Linear interpolation : 8 x 8 -> ucWidth x ucHeight
j3 1:9e457e35e2e3 378 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 379 BOOL bAMG_PUB_IMG_LinearInterpolation( UCHAR ucWidth, UCHAR ucHeight, short* pshInImg, short* pshOutImg )
j3 1:9e457e35e2e3 380 {
j3 1:9e457e35e2e3 381 const UCHAR c_ucRes = 16;
j3 1:9e457e35e2e3 382 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 383
j3 1:9e457e35e2e3 384 if( pshInImg != pshOutImg )
j3 1:9e457e35e2e3 385 {
j3 1:9e457e35e2e3 386 USHORT usImg = 0;
j3 1:9e457e35e2e3 387
j3 1:9e457e35e2e3 388 for( usImg = 0; usImg < ucWidth * ucHeight; usImg++ )
j3 1:9e457e35e2e3 389 {
j3 1:9e457e35e2e3 390 UCHAR ucImgX = usImg % ucWidth;
j3 1:9e457e35e2e3 391 UCHAR ucImgY = usImg / ucWidth;
j3 1:9e457e35e2e3 392 USHORT usSnrXn = (USHORT)( c_ucRes * ucImgX * (SNR_SZ_X-1) / (ucWidth -1) );
j3 1:9e457e35e2e3 393 USHORT usSnrYn = (USHORT)( c_ucRes * ucImgY * (SNR_SZ_Y-1) / (ucHeight-1) );
j3 1:9e457e35e2e3 394 UCHAR ucSnrX = (UCHAR)( usSnrXn / c_ucRes );
j3 1:9e457e35e2e3 395 UCHAR ucSnrY = (UCHAR)( usSnrYn / c_ucRes );
j3 1:9e457e35e2e3 396 UCHAR ucRateX1 = (UCHAR)( usSnrXn % c_ucRes );
j3 1:9e457e35e2e3 397 UCHAR ucRateY1 = (UCHAR)( usSnrYn % c_ucRes );
j3 1:9e457e35e2e3 398 UCHAR ucRateX0 = c_ucRes - ucRateX1;
j3 1:9e457e35e2e3 399 UCHAR ucRateY0 = c_ucRes - ucRateY1;
j3 1:9e457e35e2e3 400 UCHAR ucSnr = ucSnrX + ucSnrY * SNR_SZ_X;
j3 1:9e457e35e2e3 401 long loWork = 0;
j3 1:9e457e35e2e3 402
j3 1:9e457e35e2e3 403 if( ucImgX == (ucWidth - 1) )
j3 1:9e457e35e2e3 404 {
j3 1:9e457e35e2e3 405 if( ucImgY == (ucHeight - 1) )
j3 1:9e457e35e2e3 406 {
j3 1:9e457e35e2e3 407 loWork += (long)pshInImg[ucSnr ];
j3 1:9e457e35e2e3 408 }
j3 1:9e457e35e2e3 409 else
j3 1:9e457e35e2e3 410 {
j3 1:9e457e35e2e3 411 loWork += (long)pshInImg[ucSnr ] * ucRateY0;
j3 1:9e457e35e2e3 412 loWork += (long)pshInImg[ucSnr + SNR_SZ_X] * ucRateY1;
j3 1:9e457e35e2e3 413 loWork /= c_ucRes;
j3 1:9e457e35e2e3 414 }
j3 1:9e457e35e2e3 415 }
j3 1:9e457e35e2e3 416 else
j3 1:9e457e35e2e3 417 {
j3 1:9e457e35e2e3 418 if( ucImgY == (ucHeight - 1) )
j3 1:9e457e35e2e3 419 {
j3 1:9e457e35e2e3 420 loWork += (long)pshInImg[ucSnr ] * ucRateX0;
j3 1:9e457e35e2e3 421 loWork += (long)pshInImg[ucSnr + 1 ] * ucRateX1;
j3 1:9e457e35e2e3 422 loWork /= c_ucRes;
j3 1:9e457e35e2e3 423 }
j3 1:9e457e35e2e3 424 else
j3 1:9e457e35e2e3 425 {
j3 1:9e457e35e2e3 426 loWork += (long)pshInImg[ucSnr ] * ucRateX0 * ucRateY0;
j3 1:9e457e35e2e3 427 loWork += (long)pshInImg[ucSnr + 1 ] * ucRateX1 * ucRateY0;
j3 1:9e457e35e2e3 428 loWork += (long)pshInImg[ucSnr + SNR_SZ_X] * ucRateX0 * ucRateY1;
j3 1:9e457e35e2e3 429 loWork += (long)pshInImg[ucSnr + 1 + SNR_SZ_X] * ucRateX1 * ucRateY1;
j3 1:9e457e35e2e3 430 loWork /= c_ucRes * c_ucRes;
j3 1:9e457e35e2e3 431 }
j3 1:9e457e35e2e3 432 }
j3 1:9e457e35e2e3 433 pshOutImg[usImg] = (short)loWork;
j3 1:9e457e35e2e3 434 }
j3 1:9e457e35e2e3 435
j3 1:9e457e35e2e3 436 bRet = TRUE;
j3 1:9e457e35e2e3 437 }
j3 1:9e457e35e2e3 438
j3 1:9e457e35e2e3 439 return( bRet );
j3 1:9e457e35e2e3 440 }
j3 1:9e457e35e2e3 441
j3 1:9e457e35e2e3 442 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 443 Image dilation.
j3 1:9e457e35e2e3 444 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 445 BOOL bAMG_PUB_IMG_ImageDilation1( UCHAR ucWidth, UCHAR ucHeight, UCHAR* pucInImg, UCHAR* pucOutImg )
j3 1:9e457e35e2e3 446 {
j3 1:9e457e35e2e3 447 USHORT usImg = 0;
j3 1:9e457e35e2e3 448 USHORT usSize = ucWidth * ucHeight;
j3 1:9e457e35e2e3 449 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 450
j3 1:9e457e35e2e3 451 if( pucInImg != pucOutImg )
j3 1:9e457e35e2e3 452 {
j3 1:9e457e35e2e3 453 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 454 {
j3 1:9e457e35e2e3 455 pucOutImg[usImg] = 0;
j3 1:9e457e35e2e3 456 }
j3 1:9e457e35e2e3 457 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 458 {
j3 1:9e457e35e2e3 459 UCHAR ucImgX = usImg % ucWidth;
j3 1:9e457e35e2e3 460 UCHAR ucImgY = usImg / ucWidth;
j3 1:9e457e35e2e3 461
j3 1:9e457e35e2e3 462 if( 0 != pucInImg[usImg] )
j3 1:9e457e35e2e3 463 {
j3 1:9e457e35e2e3 464 pucOutImg[usImg] = 1;
j3 1:9e457e35e2e3 465 if( 0 != ucImgX )
j3 1:9e457e35e2e3 466 {
j3 1:9e457e35e2e3 467 pucOutImg[usImg - 1] = 1;
j3 1:9e457e35e2e3 468 }
j3 1:9e457e35e2e3 469 if( (ucWidth - 1) != ucImgX )
j3 1:9e457e35e2e3 470 {
j3 1:9e457e35e2e3 471 pucOutImg[usImg + 1] = 1;
j3 1:9e457e35e2e3 472 }
j3 1:9e457e35e2e3 473 if( 0 != ucImgY )
j3 1:9e457e35e2e3 474 {
j3 1:9e457e35e2e3 475 pucOutImg[usImg - ucWidth] = 1;
j3 1:9e457e35e2e3 476 }
j3 1:9e457e35e2e3 477 if( (ucHeight - 1) != ucImgY )
j3 1:9e457e35e2e3 478 {
j3 1:9e457e35e2e3 479 pucOutImg[usImg + ucWidth] = 1;
j3 1:9e457e35e2e3 480 }
j3 1:9e457e35e2e3 481 }
j3 1:9e457e35e2e3 482 }
j3 1:9e457e35e2e3 483
j3 1:9e457e35e2e3 484 bRet = TRUE;
j3 1:9e457e35e2e3 485 }
j3 1:9e457e35e2e3 486
j3 1:9e457e35e2e3 487 return( bRet );
j3 1:9e457e35e2e3 488 }
j3 1:9e457e35e2e3 489
j3 1:9e457e35e2e3 490 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 491 Image dilation.
j3 1:9e457e35e2e3 492 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 493 BOOL bAMG_PUB_IMG_ImageDilation2( UCHAR ucWidth, UCHAR ucHeight, UCHAR ucLabelNo, UCHAR* pucInImg, UCHAR* pucOutImg )
j3 1:9e457e35e2e3 494 {
j3 1:9e457e35e2e3 495 USHORT usImg = 0;
j3 1:9e457e35e2e3 496 USHORT usSize = ucWidth * ucHeight;
j3 1:9e457e35e2e3 497 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 498
j3 1:9e457e35e2e3 499 if( pucInImg != pucOutImg )
j3 1:9e457e35e2e3 500 {
j3 1:9e457e35e2e3 501 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 502 {
j3 1:9e457e35e2e3 503 pucOutImg[usImg] = 0;
j3 1:9e457e35e2e3 504 }
j3 1:9e457e35e2e3 505 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 506 {
j3 1:9e457e35e2e3 507 UCHAR ucImgX = usImg % ucWidth;
j3 1:9e457e35e2e3 508 UCHAR ucImgY = usImg / ucWidth;
j3 1:9e457e35e2e3 509
j3 1:9e457e35e2e3 510 if( ucLabelNo == pucInImg[usImg] )
j3 1:9e457e35e2e3 511 {
j3 1:9e457e35e2e3 512 pucOutImg[usImg] = 1;
j3 1:9e457e35e2e3 513 if( 0 != ucImgX )
j3 1:9e457e35e2e3 514 {
j3 1:9e457e35e2e3 515 pucOutImg[usImg - 1] = 1;
j3 1:9e457e35e2e3 516 }
j3 1:9e457e35e2e3 517 if( (ucWidth - 1) != ucImgX )
j3 1:9e457e35e2e3 518 {
j3 1:9e457e35e2e3 519 pucOutImg[usImg + 1] = 1;
j3 1:9e457e35e2e3 520 }
j3 1:9e457e35e2e3 521 if( 0 != ucImgY )
j3 1:9e457e35e2e3 522 {
j3 1:9e457e35e2e3 523 pucOutImg[usImg - ucWidth] = 1;
j3 1:9e457e35e2e3 524 }
j3 1:9e457e35e2e3 525 if( (ucHeight - 1) != ucImgY )
j3 1:9e457e35e2e3 526 {
j3 1:9e457e35e2e3 527 pucOutImg[usImg + ucWidth] = 1;
j3 1:9e457e35e2e3 528 }
j3 1:9e457e35e2e3 529 }
j3 1:9e457e35e2e3 530 }
j3 1:9e457e35e2e3 531
j3 1:9e457e35e2e3 532 bRet = TRUE;
j3 1:9e457e35e2e3 533 }
j3 1:9e457e35e2e3 534
j3 1:9e457e35e2e3 535 return( bRet );
j3 1:9e457e35e2e3 536 }
j3 1:9e457e35e2e3 537
j3 1:9e457e35e2e3 538 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 539 Object detection.
j3 1:9e457e35e2e3 540 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 541 void vAMG_PUB_ODT_CalcDiffImage( USHORT usSize, short* pshInImg1, short* pshInImg2, short* pshOutImg )
j3 1:9e457e35e2e3 542 {
j3 1:9e457e35e2e3 543 USHORT usImg = 0;
j3 1:9e457e35e2e3 544
j3 1:9e457e35e2e3 545 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 546 {
j3 1:9e457e35e2e3 547 pshOutImg[usImg] = pshInImg1[usImg] - pshInImg2[usImg];
j3 1:9e457e35e2e3 548 }
j3 1:9e457e35e2e3 549 }
j3 1:9e457e35e2e3 550
j3 1:9e457e35e2e3 551 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 552 Object detection.
j3 1:9e457e35e2e3 553 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 554 void vAMG_PUB_ODT_CalcDetectImage1( USHORT usSize, short* pshInImg, short shTh, UCHAR ucMark, UCHAR* pucOutImg )
j3 1:9e457e35e2e3 555 {
j3 1:9e457e35e2e3 556 USHORT usImg = 0;
j3 1:9e457e35e2e3 557
j3 1:9e457e35e2e3 558 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 559 {
j3 1:9e457e35e2e3 560 pucOutImg[usImg] = ( shTh <= pshInImg[usImg] ) ? ucMark : 0;
j3 1:9e457e35e2e3 561 }
j3 1:9e457e35e2e3 562 }
j3 1:9e457e35e2e3 563
j3 1:9e457e35e2e3 564 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 565 Object detection.
j3 1:9e457e35e2e3 566 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 567 void vAMG_PUB_ODT_CalcDetectImage2( USHORT usSize, short* pshInImg, short* pshTh, UCHAR ucMark, UCHAR* pucOutImg )
j3 1:9e457e35e2e3 568 {
j3 1:9e457e35e2e3 569 USHORT usImg = 0;
j3 1:9e457e35e2e3 570
j3 1:9e457e35e2e3 571 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 572 {
j3 1:9e457e35e2e3 573 pucOutImg[usImg] = ( pshTh[usImg] <= pshInImg[usImg] ) ? ucMark : 0;
j3 1:9e457e35e2e3 574 }
j3 1:9e457e35e2e3 575 }
j3 1:9e457e35e2e3 576
j3 1:9e457e35e2e3 577 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 578 Labeling.
j3 1:9e457e35e2e3 579 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 580 UCHAR ucAMG_PUB_ODT_CalcDataLabeling8( UCHAR ucWidth, UCHAR ucHeight, UCHAR ucMark, USHORT usArea, UCHAR* pucImg, USHORT* pusSearchList )
j3 1:9e457e35e2e3 581 {
j3 1:9e457e35e2e3 582 USHORT usImg = 0;
j3 1:9e457e35e2e3 583 USHORT usSize = ucWidth * ucHeight;
j3 1:9e457e35e2e3 584 UCHAR ucDetectNum = 0;
j3 1:9e457e35e2e3 585
j3 1:9e457e35e2e3 586 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 587 {
j3 1:9e457e35e2e3 588 UCHAR ucLabelNum = 0;
j3 1:9e457e35e2e3 589 USHORT usIndex = 0;
j3 1:9e457e35e2e3 590 USHORT usIndexAdd = 0;
j3 1:9e457e35e2e3 591
j3 1:9e457e35e2e3 592 if( ucMark == pucImg[usImg] )
j3 1:9e457e35e2e3 593 {
j3 1:9e457e35e2e3 594 pucImg[usImg] = 0;
j3 1:9e457e35e2e3 595 pusSearchList[usIndex] = usImg;
j3 1:9e457e35e2e3 596 usIndexAdd = 1;
j3 1:9e457e35e2e3 597 }
j3 1:9e457e35e2e3 598
j3 1:9e457e35e2e3 599 while( usIndex < usIndexAdd )
j3 1:9e457e35e2e3 600 {
j3 1:9e457e35e2e3 601 UCHAR ucX = pusSearchList[usIndex] % ucWidth;
j3 1:9e457e35e2e3 602 UCHAR ucY = pusSearchList[usIndex] / ucWidth;
j3 1:9e457e35e2e3 603 {
j3 1:9e457e35e2e3 604 if( 0 <= (ucY - 1) )
j3 1:9e457e35e2e3 605 {
j3 1:9e457e35e2e3 606 USHORT usCheckIndex = (ucX ) + (ucY-1) * ucWidth;
j3 1:9e457e35e2e3 607 if( ucMark == pucImg[usCheckIndex] )
j3 1:9e457e35e2e3 608 {
j3 1:9e457e35e2e3 609 pucImg[usCheckIndex] = 0;
j3 1:9e457e35e2e3 610 pusSearchList[usIndexAdd++] = usCheckIndex;
j3 1:9e457e35e2e3 611 }
j3 1:9e457e35e2e3 612 }
j3 1:9e457e35e2e3 613 if( ucHeight > (ucY + 1) )
j3 1:9e457e35e2e3 614 {
j3 1:9e457e35e2e3 615 USHORT usCheckIndex = (ucX ) + (ucY+1) * ucWidth;
j3 1:9e457e35e2e3 616 if( ucMark == pucImg[usCheckIndex] )
j3 1:9e457e35e2e3 617 {
j3 1:9e457e35e2e3 618 pucImg[usCheckIndex] = 0;
j3 1:9e457e35e2e3 619 pusSearchList[usIndexAdd++] = usCheckIndex;
j3 1:9e457e35e2e3 620 }
j3 1:9e457e35e2e3 621 }
j3 1:9e457e35e2e3 622 }
j3 1:9e457e35e2e3 623 if( 0 <= (ucX - 1) )
j3 1:9e457e35e2e3 624 {
j3 1:9e457e35e2e3 625 {
j3 1:9e457e35e2e3 626 USHORT usCheckIndex = (ucX-1) + (ucY ) * ucWidth;
j3 1:9e457e35e2e3 627 if( ucMark == pucImg[usCheckIndex] )
j3 1:9e457e35e2e3 628 {
j3 1:9e457e35e2e3 629 pucImg[usCheckIndex] = 0;
j3 1:9e457e35e2e3 630 pusSearchList[usIndexAdd++] = usCheckIndex;
j3 1:9e457e35e2e3 631 }
j3 1:9e457e35e2e3 632 }
j3 1:9e457e35e2e3 633 if( 0 <= (ucY - 1) )
j3 1:9e457e35e2e3 634 {
j3 1:9e457e35e2e3 635 USHORT usCheckIndex = (ucX-1) + (ucY-1) * ucWidth;
j3 1:9e457e35e2e3 636 if( ucMark == pucImg[usCheckIndex] )
j3 1:9e457e35e2e3 637 {
j3 1:9e457e35e2e3 638 pucImg[usCheckIndex] = 0;
j3 1:9e457e35e2e3 639 pusSearchList[usIndexAdd++] = usCheckIndex;
j3 1:9e457e35e2e3 640 }
j3 1:9e457e35e2e3 641 }
j3 1:9e457e35e2e3 642 if( ucHeight > (ucY + 1) )
j3 1:9e457e35e2e3 643 {
j3 1:9e457e35e2e3 644 USHORT usCheckIndex = (ucX-1) + (ucY+1) * ucWidth;
j3 1:9e457e35e2e3 645 if( ucMark == pucImg[usCheckIndex] )
j3 1:9e457e35e2e3 646 {
j3 1:9e457e35e2e3 647 pucImg[usCheckIndex] = 0;
j3 1:9e457e35e2e3 648 pusSearchList[usIndexAdd++] = usCheckIndex;
j3 1:9e457e35e2e3 649 }
j3 1:9e457e35e2e3 650 }
j3 1:9e457e35e2e3 651 }
j3 1:9e457e35e2e3 652 if( ucWidth > (ucX + 1) )
j3 1:9e457e35e2e3 653 {
j3 1:9e457e35e2e3 654 {
j3 1:9e457e35e2e3 655 USHORT usCheckIndex = (ucX+1) + (ucY ) * ucWidth;
j3 1:9e457e35e2e3 656 if( ucMark == pucImg[usCheckIndex] )
j3 1:9e457e35e2e3 657 {
j3 1:9e457e35e2e3 658 pucImg[usCheckIndex] = 0;
j3 1:9e457e35e2e3 659 pusSearchList[usIndexAdd++] = usCheckIndex;
j3 1:9e457e35e2e3 660 }
j3 1:9e457e35e2e3 661 }
j3 1:9e457e35e2e3 662 if( 0 <= (ucY - 1) )
j3 1:9e457e35e2e3 663 {
j3 1:9e457e35e2e3 664 USHORT usCheckIndex = (ucX+1) + (ucY-1) * ucWidth;
j3 1:9e457e35e2e3 665 if( ucMark == pucImg[usCheckIndex] )
j3 1:9e457e35e2e3 666 {
j3 1:9e457e35e2e3 667 pucImg[usCheckIndex] = 0;
j3 1:9e457e35e2e3 668 pusSearchList[usIndexAdd++] = usCheckIndex;
j3 1:9e457e35e2e3 669 }
j3 1:9e457e35e2e3 670 }
j3 1:9e457e35e2e3 671 if( ucHeight > (ucY + 1) )
j3 1:9e457e35e2e3 672 {
j3 1:9e457e35e2e3 673 USHORT usCheckIndex = (ucX+1) + (ucY+1) * ucWidth;
j3 1:9e457e35e2e3 674 if( ucMark == pucImg[usCheckIndex] )
j3 1:9e457e35e2e3 675 {
j3 1:9e457e35e2e3 676 pucImg[usCheckIndex] = 0;
j3 1:9e457e35e2e3 677 pusSearchList[usIndexAdd++] = usCheckIndex;
j3 1:9e457e35e2e3 678 }
j3 1:9e457e35e2e3 679 }
j3 1:9e457e35e2e3 680 }
j3 1:9e457e35e2e3 681 usIndex++;
j3 1:9e457e35e2e3 682 }
j3 1:9e457e35e2e3 683
j3 1:9e457e35e2e3 684 if( usIndex <= usArea )
j3 1:9e457e35e2e3 685 {
j3 1:9e457e35e2e3 686 ucLabelNum = 0;
j3 1:9e457e35e2e3 687 }
j3 1:9e457e35e2e3 688 else
j3 1:9e457e35e2e3 689 {
j3 1:9e457e35e2e3 690 ucDetectNum++;
j3 1:9e457e35e2e3 691 ucLabelNum = ucDetectNum;
j3 1:9e457e35e2e3 692 }
j3 1:9e457e35e2e3 693
j3 1:9e457e35e2e3 694 {
j3 1:9e457e35e2e3 695 USHORT usImg2 = 0;
j3 1:9e457e35e2e3 696 for( usImg2 = 0; usImg2 < usIndex; usImg2++ )
j3 1:9e457e35e2e3 697 {
j3 1:9e457e35e2e3 698 pucImg[ pusSearchList[usImg2] ] = ucLabelNum;
j3 1:9e457e35e2e3 699 }
j3 1:9e457e35e2e3 700 }
j3 1:9e457e35e2e3 701 }
j3 1:9e457e35e2e3 702
j3 1:9e457e35e2e3 703 return( ucDetectNum );
j3 1:9e457e35e2e3 704 }
j3 1:9e457e35e2e3 705
j3 1:9e457e35e2e3 706 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 707 Calculate features.
j3 1:9e457e35e2e3 708 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 709 BOOL bAMG_PUB_FEA_CalcArea( USHORT usSize, UCHAR ucLabelNo, UCHAR* pucImg, USHORT* pusRet )
j3 1:9e457e35e2e3 710 {
j3 1:9e457e35e2e3 711 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 712 USHORT usImg = 0;
j3 1:9e457e35e2e3 713 USHORT usArea = 0;
j3 1:9e457e35e2e3 714
j3 1:9e457e35e2e3 715 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 716 {
j3 1:9e457e35e2e3 717 if( ucLabelNo == pucImg[usImg] )
j3 1:9e457e35e2e3 718 {
j3 1:9e457e35e2e3 719 bRet = TRUE;
j3 1:9e457e35e2e3 720 usArea++;
j3 1:9e457e35e2e3 721 }
j3 1:9e457e35e2e3 722 }
j3 1:9e457e35e2e3 723
j3 1:9e457e35e2e3 724 if( FALSE != bRet )
j3 1:9e457e35e2e3 725 {
j3 1:9e457e35e2e3 726 *pusRet = usArea;
j3 1:9e457e35e2e3 727 }
j3 1:9e457e35e2e3 728
j3 1:9e457e35e2e3 729 return( bRet );
j3 1:9e457e35e2e3 730 }
j3 1:9e457e35e2e3 731
j3 1:9e457e35e2e3 732 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 733 Calculate features.
j3 1:9e457e35e2e3 734 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 735 BOOL bAMG_PUB_FEA_CalcRectangle( UCHAR ucWidth, UCHAR ucHeight, UCHAR ucLabelNo, UCHAR* pucImg, UCHAR* pucRet )
j3 1:9e457e35e2e3 736 {
j3 1:9e457e35e2e3 737 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 738 USHORT usImg = 0;
j3 1:9e457e35e2e3 739 USHORT usSize = ucWidth * ucHeight;
j3 1:9e457e35e2e3 740 UCHAR ucMinX = ucWidth - 1;
j3 1:9e457e35e2e3 741 UCHAR ucMinY = ucHeight - 1;
j3 1:9e457e35e2e3 742 UCHAR ucMaxX = 0;
j3 1:9e457e35e2e3 743 UCHAR ucMaxY = 0;
j3 1:9e457e35e2e3 744
j3 1:9e457e35e2e3 745 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 746 {
j3 1:9e457e35e2e3 747 UCHAR ucImgX = usImg % ucWidth;
j3 1:9e457e35e2e3 748 UCHAR ucImgY = usImg / ucWidth;
j3 1:9e457e35e2e3 749
j3 1:9e457e35e2e3 750 if( ucLabelNo == pucImg[usImg] )
j3 1:9e457e35e2e3 751 {
j3 1:9e457e35e2e3 752 bRet = TRUE;
j3 1:9e457e35e2e3 753 if( ucMinX > ucImgX )
j3 1:9e457e35e2e3 754 {
j3 1:9e457e35e2e3 755 ucMinX = ucImgX;
j3 1:9e457e35e2e3 756 }
j3 1:9e457e35e2e3 757 if( ucMinY > ucImgY )
j3 1:9e457e35e2e3 758 {
j3 1:9e457e35e2e3 759 ucMinY = ucImgY;
j3 1:9e457e35e2e3 760 }
j3 1:9e457e35e2e3 761 if( ucMaxX < ucImgX )
j3 1:9e457e35e2e3 762 {
j3 1:9e457e35e2e3 763 ucMaxX = ucImgX;
j3 1:9e457e35e2e3 764 }
j3 1:9e457e35e2e3 765 if( ucMaxY < ucImgY )
j3 1:9e457e35e2e3 766 {
j3 1:9e457e35e2e3 767 ucMaxY = ucImgY;
j3 1:9e457e35e2e3 768 }
j3 1:9e457e35e2e3 769 }
j3 1:9e457e35e2e3 770 }
j3 1:9e457e35e2e3 771
j3 1:9e457e35e2e3 772 if( FALSE != bRet )
j3 1:9e457e35e2e3 773 {
j3 1:9e457e35e2e3 774 pucRet[0] = ucMinX;
j3 1:9e457e35e2e3 775 pucRet[1] = ucMinY;
j3 1:9e457e35e2e3 776 pucRet[2] = ucMaxX;
j3 1:9e457e35e2e3 777 pucRet[3] = ucMaxY;
j3 1:9e457e35e2e3 778 }
j3 1:9e457e35e2e3 779
j3 1:9e457e35e2e3 780 return( bRet );
j3 1:9e457e35e2e3 781 }
j3 1:9e457e35e2e3 782
j3 1:9e457e35e2e3 783 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 784 Calculate features.
j3 1:9e457e35e2e3 785 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 786 BOOL bAMG_PUB_FEA_CalcMinTemp( USHORT usSize, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, short* pshRet )
j3 1:9e457e35e2e3 787 {
j3 1:9e457e35e2e3 788 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 789 USHORT usImg = 0;
j3 1:9e457e35e2e3 790 short shMin = SHORT_MAX_VAL;
j3 1:9e457e35e2e3 791
j3 1:9e457e35e2e3 792 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 793 {
j3 1:9e457e35e2e3 794 if( ucLabelNo == pucImg[usImg] )
j3 1:9e457e35e2e3 795 {
j3 1:9e457e35e2e3 796 bRet = TRUE;
j3 1:9e457e35e2e3 797 if( shMin > pshImg[usImg] )
j3 1:9e457e35e2e3 798 {
j3 1:9e457e35e2e3 799 shMin = pshImg[usImg];
j3 1:9e457e35e2e3 800 }
j3 1:9e457e35e2e3 801 }
j3 1:9e457e35e2e3 802 }
j3 1:9e457e35e2e3 803
j3 1:9e457e35e2e3 804 if( FALSE != bRet )
j3 1:9e457e35e2e3 805 {
j3 1:9e457e35e2e3 806 *pshRet = shMin;
j3 1:9e457e35e2e3 807 }
j3 1:9e457e35e2e3 808
j3 1:9e457e35e2e3 809 return( bRet );
j3 1:9e457e35e2e3 810 }
j3 1:9e457e35e2e3 811
j3 1:9e457e35e2e3 812 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 813 Calculate features.
j3 1:9e457e35e2e3 814 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 815 BOOL bAMG_PUB_FEA_CalcMaxTemp( USHORT usSize, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, short* pshRet )
j3 1:9e457e35e2e3 816 {
j3 1:9e457e35e2e3 817 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 818 USHORT usImg = 0;
j3 1:9e457e35e2e3 819 short shMax = SHORT_MIN_VAL;
j3 1:9e457e35e2e3 820
j3 1:9e457e35e2e3 821 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 822 {
j3 1:9e457e35e2e3 823 if( ucLabelNo == pucImg[usImg] )
j3 1:9e457e35e2e3 824 {
j3 1:9e457e35e2e3 825 bRet = TRUE;
j3 1:9e457e35e2e3 826 if( shMax < pshImg[usImg] )
j3 1:9e457e35e2e3 827 {
j3 1:9e457e35e2e3 828 shMax = pshImg[usImg];
j3 1:9e457e35e2e3 829 }
j3 1:9e457e35e2e3 830 }
j3 1:9e457e35e2e3 831 }
j3 1:9e457e35e2e3 832
j3 1:9e457e35e2e3 833 if( FALSE != bRet )
j3 1:9e457e35e2e3 834 {
j3 1:9e457e35e2e3 835 *pshRet = shMax;
j3 1:9e457e35e2e3 836 }
j3 1:9e457e35e2e3 837
j3 1:9e457e35e2e3 838 return( bRet );
j3 1:9e457e35e2e3 839 }
j3 1:9e457e35e2e3 840
j3 1:9e457e35e2e3 841 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 842 Calculate features.
j3 1:9e457e35e2e3 843 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 844 BOOL bAMG_PUB_FEA_CalcAveTemp( USHORT usSize, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, short* pshRet )
j3 1:9e457e35e2e3 845 {
j3 1:9e457e35e2e3 846 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 847 USHORT usImg = 0;
j3 1:9e457e35e2e3 848 long loSum = 0;
j3 1:9e457e35e2e3 849 USHORT usCnt = 0;
j3 1:9e457e35e2e3 850
j3 1:9e457e35e2e3 851 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 852 {
j3 1:9e457e35e2e3 853 if( ucLabelNo == pucImg[usImg] )
j3 1:9e457e35e2e3 854 {
j3 1:9e457e35e2e3 855 bRet = TRUE;
j3 1:9e457e35e2e3 856 loSum += pshImg[usImg];
j3 1:9e457e35e2e3 857 usCnt++;
j3 1:9e457e35e2e3 858 }
j3 1:9e457e35e2e3 859 }
j3 1:9e457e35e2e3 860
j3 1:9e457e35e2e3 861 if( FALSE != bRet )
j3 1:9e457e35e2e3 862 {
j3 1:9e457e35e2e3 863 *pshRet = (short)( loSum / usCnt );
j3 1:9e457e35e2e3 864 }
j3 1:9e457e35e2e3 865
j3 1:9e457e35e2e3 866 return( bRet );
j3 1:9e457e35e2e3 867 }
j3 1:9e457e35e2e3 868
j3 1:9e457e35e2e3 869 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 870 Calculate features.
j3 1:9e457e35e2e3 871 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 872 BOOL bAMG_PUB_FEA_CalcStdDevTemp( USHORT usSize, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, USHORT* pusRet )
j3 1:9e457e35e2e3 873 {
j3 1:9e457e35e2e3 874 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 875 USHORT usImg = 0;
j3 1:9e457e35e2e3 876 ULONG ulS = 0;
j3 1:9e457e35e2e3 877 USHORT usCnt = 0;
j3 1:9e457e35e2e3 878 short shAve = 0;
j3 1:9e457e35e2e3 879
j3 1:9e457e35e2e3 880 if( FALSE != bAMG_PUB_FEA_CalcAveTemp( usSize, ucLabelNo, pucImg, pshImg, &shAve ) )
j3 1:9e457e35e2e3 881 {
j3 1:9e457e35e2e3 882 bRet = TRUE;
j3 1:9e457e35e2e3 883 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 884 {
j3 1:9e457e35e2e3 885 if( ucLabelNo == pucImg[usImg] )
j3 1:9e457e35e2e3 886 {
j3 1:9e457e35e2e3 887 ULONG ulPow = (ULONG)( (long)(pshImg[usImg] - shAve) * (pshImg[usImg] - shAve) );
j3 1:9e457e35e2e3 888 if( (ULONG_MAX_VAL - ulS) < ulPow )
j3 1:9e457e35e2e3 889 {
j3 1:9e457e35e2e3 890 bRet = FALSE;
j3 1:9e457e35e2e3 891 }
j3 1:9e457e35e2e3 892 else
j3 1:9e457e35e2e3 893 {
j3 1:9e457e35e2e3 894 ulS += ulPow;
j3 1:9e457e35e2e3 895 usCnt++;
j3 1:9e457e35e2e3 896 }
j3 1:9e457e35e2e3 897 }
j3 1:9e457e35e2e3 898 }
j3 1:9e457e35e2e3 899 }
j3 1:9e457e35e2e3 900
j3 1:9e457e35e2e3 901 if( FALSE != bRet )
j3 1:9e457e35e2e3 902 {
j3 1:9e457e35e2e3 903 ULONG ulData = ulS / usCnt;
j3 1:9e457e35e2e3 904 ULONG ulWork = ( 1 < ulData ) ? ulData : 1;
j3 1:9e457e35e2e3 905 ULONG ulSqrt = 0;
j3 1:9e457e35e2e3 906 if( 0 != ulData )
j3 1:9e457e35e2e3 907 {
j3 1:9e457e35e2e3 908 do
j3 1:9e457e35e2e3 909 {
j3 1:9e457e35e2e3 910 ulSqrt = ulWork;
j3 1:9e457e35e2e3 911 ulWork = (ulData / ulWork + ulWork) >> 1;
j3 1:9e457e35e2e3 912 }
j3 1:9e457e35e2e3 913 while( ulWork < ulSqrt );
j3 1:9e457e35e2e3 914 }
j3 1:9e457e35e2e3 915 *pusRet = (USHORT)ulSqrt;
j3 1:9e457e35e2e3 916 }
j3 1:9e457e35e2e3 917
j3 1:9e457e35e2e3 918 return( bRet );
j3 1:9e457e35e2e3 919 }
j3 1:9e457e35e2e3 920
j3 1:9e457e35e2e3 921 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 922 Calculate features.
j3 1:9e457e35e2e3 923 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 924 BOOL bAMG_PUB_FEA_CalcStdDevTemp_f( USHORT usSize, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, float* pfRet )
j3 1:9e457e35e2e3 925 {
j3 1:9e457e35e2e3 926 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 927 USHORT usImg = 0;
j3 1:9e457e35e2e3 928 float fS = 0;
j3 1:9e457e35e2e3 929 USHORT usCnt = 0;
j3 1:9e457e35e2e3 930 short shAve = 0;
j3 1:9e457e35e2e3 931
j3 1:9e457e35e2e3 932 if( FALSE != bAMG_PUB_FEA_CalcAveTemp( usSize, ucLabelNo, pucImg, pshImg, &shAve ) )
j3 1:9e457e35e2e3 933 {
j3 1:9e457e35e2e3 934 bRet = TRUE;
j3 1:9e457e35e2e3 935 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 936 {
j3 1:9e457e35e2e3 937 if( ucLabelNo == pucImg[usImg] )
j3 1:9e457e35e2e3 938 {
j3 1:9e457e35e2e3 939 float fDiff = fAMG_PUB_CMN_ConvStoF(pshImg[usImg] - shAve);
j3 1:9e457e35e2e3 940 fS += fDiff * fDiff;
j3 1:9e457e35e2e3 941 usCnt++;
j3 1:9e457e35e2e3 942 }
j3 1:9e457e35e2e3 943 }
j3 1:9e457e35e2e3 944 }
j3 1:9e457e35e2e3 945
j3 1:9e457e35e2e3 946 if( FALSE != bRet )
j3 1:9e457e35e2e3 947 {
j3 1:9e457e35e2e3 948 float fData = fS / usCnt;
j3 1:9e457e35e2e3 949 float fWork = ( 1 < fData ) ? fData : 1;
j3 1:9e457e35e2e3 950 float fSqrt = 0;
j3 1:9e457e35e2e3 951 if( 0 < fData )
j3 1:9e457e35e2e3 952 {
j3 1:9e457e35e2e3 953 do
j3 1:9e457e35e2e3 954 {
j3 1:9e457e35e2e3 955 fSqrt = fWork;
j3 1:9e457e35e2e3 956 fWork = (fData / fWork + fWork) * 0.5f;
j3 1:9e457e35e2e3 957 }
j3 1:9e457e35e2e3 958 while( fWork < fSqrt );
j3 1:9e457e35e2e3 959 }
j3 1:9e457e35e2e3 960 *pfRet = fSqrt;
j3 1:9e457e35e2e3 961 }
j3 1:9e457e35e2e3 962
j3 1:9e457e35e2e3 963 return( bRet );
j3 1:9e457e35e2e3 964 }
j3 1:9e457e35e2e3 965
j3 1:9e457e35e2e3 966 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 967 Calculate features.
j3 1:9e457e35e2e3 968 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 969 BOOL bAMG_PUB_FEA_CalcCenterTemp( UCHAR ucWidth, UCHAR ucHeight, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, short* pshRet )
j3 1:9e457e35e2e3 970 {
j3 1:9e457e35e2e3 971 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 972 USHORT usImg = 0;
j3 1:9e457e35e2e3 973 USHORT usSize = ucWidth * ucHeight;
j3 1:9e457e35e2e3 974 short shMin = SHORT_MAX_VAL;
j3 1:9e457e35e2e3 975 ULONG ulGx = 0;
j3 1:9e457e35e2e3 976 ULONG ulGy = 0;
j3 1:9e457e35e2e3 977 ULONG ulGw = 0;
j3 1:9e457e35e2e3 978
j3 1:9e457e35e2e3 979 if( FALSE != bAMG_PUB_FEA_CalcMinTemp( usSize, ucLabelNo, pucImg, pshImg, &shMin ) )
j3 1:9e457e35e2e3 980 {
j3 1:9e457e35e2e3 981 shMin -= 1;
j3 1:9e457e35e2e3 982 bRet = TRUE;
j3 1:9e457e35e2e3 983 }
j3 1:9e457e35e2e3 984 if( FALSE != bRet )
j3 1:9e457e35e2e3 985 {
j3 1:9e457e35e2e3 986 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 987 {
j3 1:9e457e35e2e3 988 if( ucLabelNo == pucImg[usImg] )
j3 1:9e457e35e2e3 989 {
j3 1:9e457e35e2e3 990 UCHAR ucImgX = usImg % ucWidth;
j3 1:9e457e35e2e3 991 UCHAR ucImgY = usImg / ucWidth;
j3 1:9e457e35e2e3 992 ULONG ulWeight = (ULONG)( pshImg[usImg] - shMin );
j3 1:9e457e35e2e3 993 ulGx += ulWeight * (ucImgX + 1);
j3 1:9e457e35e2e3 994 ulGy += ulWeight * (ucImgY + 1);
j3 1:9e457e35e2e3 995 ulGw += ulWeight;
j3 1:9e457e35e2e3 996 }
j3 1:9e457e35e2e3 997 }
j3 1:9e457e35e2e3 998
j3 1:9e457e35e2e3 999 if( 0 < ulGw )
j3 1:9e457e35e2e3 1000 {
j3 1:9e457e35e2e3 1001 pshRet[0] = ulGx * 256 / ulGw - 256;
j3 1:9e457e35e2e3 1002 pshRet[1] = ulGy * 256 / ulGw - 256;
j3 1:9e457e35e2e3 1003 }
j3 1:9e457e35e2e3 1004 else
j3 1:9e457e35e2e3 1005 {
j3 1:9e457e35e2e3 1006 pshRet[0] = 0;
j3 1:9e457e35e2e3 1007 pshRet[1] = 0;
j3 1:9e457e35e2e3 1008 }
j3 1:9e457e35e2e3 1009 }
j3 1:9e457e35e2e3 1010
j3 1:9e457e35e2e3 1011 return( bRet );
j3 1:9e457e35e2e3 1012 }
j3 1:9e457e35e2e3 1013
j3 1:9e457e35e2e3 1014 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 1015 Calculate features.
j3 1:9e457e35e2e3 1016 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 1017 BOOL bAMG_PUB_FEA_CalcCenterTemp_f( UCHAR ucWidth, UCHAR ucHeight, UCHAR ucLabelNo, UCHAR* pucImg, short* pshImg, float* pfRet )
j3 1:9e457e35e2e3 1018 {
j3 1:9e457e35e2e3 1019 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 1020 USHORT usImg = 0;
j3 1:9e457e35e2e3 1021 USHORT usSize = ucWidth * ucHeight;
j3 1:9e457e35e2e3 1022 short shMin = SHORT_MAX_VAL;
j3 1:9e457e35e2e3 1023 short shMax = SHORT_MIN_VAL;
j3 1:9e457e35e2e3 1024 short shDiff = 0;
j3 1:9e457e35e2e3 1025 float fGx = 0;
j3 1:9e457e35e2e3 1026 float fGy = 0;
j3 1:9e457e35e2e3 1027 float fGw = 0;
j3 1:9e457e35e2e3 1028
j3 1:9e457e35e2e3 1029 if( FALSE != bAMG_PUB_FEA_CalcMinTemp( usSize, ucLabelNo, pucImg, pshImg, &shMin ) )
j3 1:9e457e35e2e3 1030 {
j3 1:9e457e35e2e3 1031 shMin -= 1;
j3 1:9e457e35e2e3 1032 if( FALSE != bAMG_PUB_FEA_CalcMaxTemp( usSize, ucLabelNo, pucImg, pshImg, &shMax ) )
j3 1:9e457e35e2e3 1033 {
j3 1:9e457e35e2e3 1034 bRet = TRUE;
j3 1:9e457e35e2e3 1035 }
j3 1:9e457e35e2e3 1036 }
j3 1:9e457e35e2e3 1037 if( FALSE != bRet )
j3 1:9e457e35e2e3 1038 {
j3 1:9e457e35e2e3 1039 shDiff = shMax - shMin;
j3 1:9e457e35e2e3 1040 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 1041 {
j3 1:9e457e35e2e3 1042 if( ucLabelNo == pucImg[usImg] )
j3 1:9e457e35e2e3 1043 {
j3 1:9e457e35e2e3 1044 UCHAR ucImgX = usImg % ucWidth;
j3 1:9e457e35e2e3 1045 UCHAR ucImgY = usImg / ucWidth;
j3 1:9e457e35e2e3 1046 float fWeight = (float)( pshImg[usImg] - shMin ) / shDiff;
j3 1:9e457e35e2e3 1047 fGx += fWeight * (ucImgX + 1);
j3 1:9e457e35e2e3 1048 fGy += fWeight * (ucImgY + 1);
j3 1:9e457e35e2e3 1049 fGw += fWeight;
j3 1:9e457e35e2e3 1050 }
j3 1:9e457e35e2e3 1051 }
j3 1:9e457e35e2e3 1052
j3 1:9e457e35e2e3 1053 if( 0 < fGw )
j3 1:9e457e35e2e3 1054 {
j3 1:9e457e35e2e3 1055 pfRet[0] = fGx / fGw - 1;
j3 1:9e457e35e2e3 1056 pfRet[1] = fGy / fGw - 1;
j3 1:9e457e35e2e3 1057 }
j3 1:9e457e35e2e3 1058 else
j3 1:9e457e35e2e3 1059 {
j3 1:9e457e35e2e3 1060 pfRet[0] = 0;
j3 1:9e457e35e2e3 1061 pfRet[1] = 0;
j3 1:9e457e35e2e3 1062 }
j3 1:9e457e35e2e3 1063 }
j3 1:9e457e35e2e3 1064
j3 1:9e457e35e2e3 1065 return( bRet );
j3 1:9e457e35e2e3 1066 }
j3 1:9e457e35e2e3 1067
j3 1:9e457e35e2e3 1068 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 1069 Update background temperature.
j3 1:9e457e35e2e3 1070 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 1071 BOOL bAMG_PUB_BGT_UpdateBackTemp( USHORT usSize, UCHAR* pucImg, short* pshDiffImg, short shTh, short* pshBackImg )
j3 1:9e457e35e2e3 1072 {
j3 1:9e457e35e2e3 1073 const short c_shMinTh = 0;
j3 1:9e457e35e2e3 1074 const short c_shMaxTh = 256;
j3 1:9e457e35e2e3 1075 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 1076 USHORT usImg = 0;
j3 1:9e457e35e2e3 1077 short shAve = 0;
j3 1:9e457e35e2e3 1078
j3 1:9e457e35e2e3 1079 /* Adjust parameter. */
j3 1:9e457e35e2e3 1080 if( c_shMinTh > shTh )
j3 1:9e457e35e2e3 1081 {
j3 1:9e457e35e2e3 1082 shTh = c_shMinTh;
j3 1:9e457e35e2e3 1083 }
j3 1:9e457e35e2e3 1084 if( c_shMaxTh < shTh )
j3 1:9e457e35e2e3 1085 {
j3 1:9e457e35e2e3 1086 shTh = c_shMaxTh;
j3 1:9e457e35e2e3 1087 }
j3 1:9e457e35e2e3 1088
j3 1:9e457e35e2e3 1089 if( FALSE != bAMG_PUB_FEA_CalcAveTemp( usSize, 0, pucImg, pshDiffImg, &shAve ) )
j3 1:9e457e35e2e3 1090 {
j3 1:9e457e35e2e3 1091 bRet = TRUE;
j3 1:9e457e35e2e3 1092 for( usImg = 0; usImg < usSize; usImg++ )
j3 1:9e457e35e2e3 1093 {
j3 1:9e457e35e2e3 1094 short shTemp = 0;
j3 1:9e457e35e2e3 1095 if( 0 == pucImg[usImg] )
j3 1:9e457e35e2e3 1096 {
j3 1:9e457e35e2e3 1097 shTemp = (short)( (long)shTh * pshDiffImg[usImg] / c_shMaxTh );
j3 1:9e457e35e2e3 1098 }
j3 1:9e457e35e2e3 1099 else
j3 1:9e457e35e2e3 1100 {
j3 1:9e457e35e2e3 1101 shTemp = (short)( (long)shTh * shAve / c_shMaxTh );
j3 1:9e457e35e2e3 1102 }
j3 1:9e457e35e2e3 1103 pshBackImg[usImg] += shTemp;
j3 1:9e457e35e2e3 1104 }
j3 1:9e457e35e2e3 1105 }
j3 1:9e457e35e2e3 1106
j3 1:9e457e35e2e3 1107 return( bRet );
j3 1:9e457e35e2e3 1108 }
j3 1:9e457e35e2e3 1109
j3 1:9e457e35e2e3 1110 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 1111 Judge human.
j3 1:9e457e35e2e3 1112 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 1113 BOOL bAMG_PUB_HDT_JudgeHuman( USHORT usSize, USHORT usTh )
j3 1:9e457e35e2e3 1114 {
j3 1:9e457e35e2e3 1115 return( ( usTh < usSize ) ? TRUE : FALSE );
j3 1:9e457e35e2e3 1116 }
j3 1:9e457e35e2e3 1117
j3 1:9e457e35e2e3 1118 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 1119 Output.
j3 1:9e457e35e2e3 1120 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 1121 BOOL bAMG_PUB_OUT_CalcOutImage( UCHAR ucImgWidth, UCHAR ucImgHeight, UCHAR ucOutWidth, UCHAR ucOutHeight, short* pshCenter, UCHAR* pucCenter )
j3 1:9e457e35e2e3 1122 {
j3 1:9e457e35e2e3 1123 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 1124
j3 1:9e457e35e2e3 1125 if( (0 <= pshCenter[0]) && ((ucImgWidth-1) >= (pshCenter[0]/256)) )
j3 1:9e457e35e2e3 1126 {
j3 1:9e457e35e2e3 1127 if( (0 <= pshCenter[1]) && ((ucImgHeight-1) >= (pshCenter[1]/256)) )
j3 1:9e457e35e2e3 1128 {
j3 1:9e457e35e2e3 1129 bRet = TRUE;
j3 1:9e457e35e2e3 1130 pucCenter[0] = (UCHAR)( (long)pshCenter[0] * ucOutWidth / ((long)ucImgWidth * 256) );
j3 1:9e457e35e2e3 1131 pucCenter[1] = (UCHAR)( (long)pshCenter[1] * ucOutHeight / ((long)ucImgHeight * 256) );
j3 1:9e457e35e2e3 1132 }
j3 1:9e457e35e2e3 1133 }
j3 1:9e457e35e2e3 1134
j3 1:9e457e35e2e3 1135 return( bRet );
j3 1:9e457e35e2e3 1136 }
j3 1:9e457e35e2e3 1137
j3 1:9e457e35e2e3 1138 /*------------------------------------------------------------------------------
j3 1:9e457e35e2e3 1139 Output.
j3 1:9e457e35e2e3 1140 ------------------------------------------------------------------------------*/
j3 1:9e457e35e2e3 1141 BOOL bAMG_PUB_OUT_CalcOutImage_f( UCHAR ucImgWidth, UCHAR ucImgHeight, UCHAR ucOutWidth, UCHAR ucOutHeight, float* pfCenter, UCHAR* pucCenter )
j3 1:9e457e35e2e3 1142 {
j3 1:9e457e35e2e3 1143 BOOL bRet = FALSE;
j3 1:9e457e35e2e3 1144
j3 1:9e457e35e2e3 1145 if( (0 <= pfCenter[0]) && ((ucImgWidth-1) >= pfCenter[0]) )
j3 1:9e457e35e2e3 1146 {
j3 1:9e457e35e2e3 1147 if( (0 <= pfCenter[1]) && ((ucImgHeight-1) >= pfCenter[1]) )
j3 1:9e457e35e2e3 1148 {
j3 1:9e457e35e2e3 1149 bRet = TRUE;
j3 1:9e457e35e2e3 1150 pucCenter[0] = (UCHAR)( pfCenter[0] * ucOutWidth / (float)ucImgWidth );
j3 1:9e457e35e2e3 1151 pucCenter[1] = (UCHAR)( pfCenter[1] * ucOutHeight / (float)ucImgHeight );
j3 1:9e457e35e2e3 1152 }
j3 1:9e457e35e2e3 1153 }
j3 1:9e457e35e2e3 1154
j3 1:9e457e35e2e3 1155 return( bRet );
j3 1:9e457e35e2e3 1156 }
j3 1:9e457e35e2e3 1157