Library for MAXREFDES131 OneWire GridEYE sensor interface

Dependents:   MAXREFDES131_Qt_Demo MAXREFDES130_131_Demo

Committer:
j3
Date:
Mon Sep 26 15:08:17 2016 -0700
Revision:
12:4b7ac3b21d91
Parent:
8:fa89d4cd41cd
Fix include paths

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