Library for MAXREFDES131 OneWire GridEYE sensor interface

Dependents:   MAXREFDES131_Qt_Demo MAXREFDES130_131_Demo

Committer:
j3
Date:
Sat Apr 30 01:27:34 2016 +0000
Revision:
1:9e457e35e2e3
Child:
3:5b025369ad96
Added API code from Panasonic to OWGridEye Library

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