00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef APPMEDIA_APP_PARSE_NEED_FOR_SPEED_C_DEFINED
00039 #define APPMEDIA_APP_PARSE_NEED_FOR_SPEED_C_DEFINED
00040
00041 #include "Component/ModelManager.H"
00042 #include "GUI/XWinManaged.H"
00043 #include "Image/ColorOps.H"
00044 #include "Image/CutPaste.H"
00045 #include "Image/DrawOps.H"
00046 #include "Image/Image.H"
00047 #include "Image/MathOps.H"
00048 #include "Image/Pixels.H"
00049 #include "Image/Point2D.H"
00050 #include "Image/ShapeOps.H"
00051 #include "Media/FrameSeries.H"
00052 #include "Raster/GenericFrame.H"
00053 #include "Raster/Raster.H"
00054 #include "Util/log.H"
00055 #include "Util/sformat.H"
00056 #include "Video/VideoFrame.H"
00057
00058 #include <algorithm>
00059 #include <iostream>
00060 #include <limits>
00061 #include <sstream>
00062 #include <sys/types.h>
00063 #include <unistd.h>
00064 #include <vector>
00065
00066 namespace
00067 {
00068 const float ILAB_data[] =
00069 {
00070
00071 48.4333, 49.0800, 49.3356, 49.4956, 49.5689, 49.3133, 49.7711, 50.9822, 52.1600, 53.1111, 52.0156, 51.1156, 50.2400, 50.8200, 51.6133, 51.5867, 51.2689, 50.7444, 50.6156, 51.1044, 51.8956, 52.7200, 53.3378, 52.9844, 52.4444, 51.9844, 52.0133, 52.2911, 52.3733, 52.7111, 52.5489,
00072 52.5111, 54.9711, 59.1000, 63.9200, 64.9622, 61.8600, 58.4089, 60.7356, 66.3578, 71.2311, 65.9600, 58.8400, 53.8511, 54.1244, 55.9044, 55.6889, 56.3089, 57.8289, 60.0644, 60.2533, 58.3800, 56.7956, 56.1733, 57.6267, 60.4822, 64.1933, 66.6622, 67.4444, 65.4889, 62.3800, 58.6622,
00073 54.3889, 68.1889, 93.3978, 118.2267, 122.4600, 105.1467, 81.1644, 77.7956, 90.3133, 102.3489, 88.1378, 67.1156, 53.9622, 53.8644, 56.1978, 56.0267, 63.8000, 78.3778, 91.2422, 87.1156, 71.0578, 56.7022, 53.8800, 65.6667, 85.8867, 108.3978, 122.4089, 125.7444, 114.4556, 94.9889, 72.6356,
00074 54.9667, 83.5844, 137.8822, 188.7444, 196.6711, 162.1733, 111.2578, 97.3667, 114.3000, 130.3044, 105.4644, 72.6778, 53.4444, 53.6711, 54.4711, 55.3222, 76.8933, 114.2178, 142.3844, 129.7756, 89.9022, 54.9511, 50.7622, 79.1178, 124.3378, 168.9667, 188.8956, 194.2489, 179.7644, 147.2956, 102.4622,
00075 51.4667, 81.8533, 143.4422, 204.3200, 211.9111, 166.2133, 114.2267, 103.7778, 126.9000, 138.0867, 104.6156, 70.1267, 52.0911, 54.0044, 53.7867, 59.4911, 93.1756, 144.8978, 176.4533, 156.5089, 100.1178, 54.2311, 53.0222, 93.2067, 145.8711, 181.1289, 185.9978, 192.4844, 187.9933, 175.8511, 131.1022,
00076 47.0111, 70.3511, 121.0111, 173.1911, 174.1400, 124.9733, 92.3622, 98.9933, 132.3467, 135.0200, 95.5022, 63.6178, 49.8333, 54.1267, 57.5733, 70.6022, 108.0533, 156.7000, 178.2889, 158.7978, 100.0467, 56.8844, 60.2044, 104.5667, 151.7889, 159.0689, 136.7156, 138.8178, 153.1689, 170.6311, 137.7067,
00077 46.2111, 68.6511, 112.1489, 153.5889, 141.2867, 94.1333, 77.1533, 98.1156, 136.3778, 131.2578, 89.6756, 59.0489, 48.2822, 55.6000, 68.1800, 86.4444, 118.8133, 151.9044, 164.3333, 152.7756, 101.4000, 63.1822, 65.8844, 112.1867, 164.5111, 172.5111, 152.6511, 148.6244, 154.8600, 161.3489, 125.1444,
00078 47.8578, 77.0867, 120.6667, 154.1400, 126.7178, 81.8933, 73.9333, 103.4978, 140.9444, 126.4800, 86.0667, 55.7044, 47.4444, 58.7956, 81.6733, 107.3667, 136.2467, 154.9978, 162.3356, 153.2244, 107.9600, 70.8711, 71.4733, 119.7533, 182.7689, 205.7222, 205.4222, 200.1467, 189.3978, 161.7556, 112.4533,
00079 51.4400, 87.2689, 132.7156, 156.9067, 117.8622, 76.0422, 75.3733, 110.0467, 142.8711, 119.3556, 81.2511, 51.9444, 47.3467, 64.4200, 97.9400, 138.3378, 171.6378, 188.6356, 188.2244, 167.9311, 116.5333, 77.5000, 81.3622, 127.2889, 180.2578, 194.3467, 199.0133, 199.3067, 195.2222, 163.0556, 109.9578,
00080 59.7222, 102.5089, 148.2911, 158.9911, 111.5644, 72.9933, 78.9200, 118.1244, 146.8622, 121.1156, 85.6289, 56.2511, 53.9467, 77.3111, 117.9622, 164.1378, 191.1822, 204.5133, 201.6533, 179.5311, 122.4556, 83.4733, 91.4467, 132.2400, 162.7311, 148.0244, 143.7489, 154.1644, 173.2800, 156.3200, 107.4422,
00081 81.8156, 138.5022, 184.0378, 180.9667, 123.1311, 77.9511, 84.7600, 130.7800, 171.3133, 163.0644, 132.5089, 95.4644, 84.0778, 101.5111, 135.1467, 158.5400, 159.6089, 166.9133, 171.9000, 169.1778, 124.3667, 88.9022, 97.4422, 140.5889, 172.5333, 159.0600, 151.1622, 153.5778, 163.3933, 139.4689, 94.1644,
00082 105.3844, 175.3178, 215.2556, 207.7689, 145.9644, 89.9533, 90.5356, 139.9689, 197.5311, 212.1822, 194.8533, 152.5778, 123.8311, 121.8444, 139.5533, 131.9222, 108.4378, 106.0000, 124.0911, 146.1200, 118.7422, 89.9378, 98.6889, 149.1978, 197.7689, 205.7800, 199.2978, 181.7022, 155.9800, 113.1044, 76.0333,
00083 100.2644, 157.4200, 190.8422, 183.6756, 135.4400, 89.1533, 85.1356, 121.9822, 172.9933, 196.3422, 186.6378, 152.1311, 122.9800, 111.4511, 118.0644, 101.8133, 79.3400, 74.5956, 91.9222, 114.5000, 99.5111, 81.1933, 88.6200, 130.3089, 176.3467, 193.2733, 186.6333, 158.9200, 121.7111, 84.7711, 64.0889,
00084 75.4733, 99.9489, 114.4267, 112.2156, 91.8467, 72.3156, 69.9289, 85.4356, 107.5556, 119.5311, 115.3867, 99.7778, 86.7800, 80.7067, 82.5578, 74.1933, 64.8844, 62.6444, 70.3844, 80.2178, 74.4422, 67.5511, 71.3000, 89.6489, 110.0756, 117.9800, 112.6311, 98.1022, 80.2378, 66.4156, 59.9956,
00085 59.9978, 64.2289, 66.9422, 66.5244, 62.7578, 59.9511, 59.8489, 62.6467, 66.1444, 67.6711, 66.6644, 64.1911, 62.2111, 61.3933, 61.5822, 59.8067, 58.4244, 58.2689, 59.9400, 61.7733, 60.6444, 59.9000, 61.0044, 64.3222, 67.0956, 67.5667, 65.9978, 63.7756, 61.4133, 60.0622, 59.0400
00086 };
00087
00088 const float digit0_data[] =
00089 {
00090 18.9858, 18.5589, 18.3984, 18.0650, 17.9390, 17.3354, 16.9878, 17.0041,
00091 11.7276, 11.2012, 12.6362, 16.8984, 20.5955, 19.7927, 15.0691, 11.0976,
00092 10.9329, 11.9695, 24.1667, 49.5874, 66.6728, 62.8130, 38.2398, 15.2215,
00093 13.2561, 21.8069, 58.6159, 114.0366, 147.7012, 137.9329, 87.8943, 33.2154,
00094 19.2114, 42.3354, 93.3191, 147.2581, 178.3882, 168.2317, 121.1260, 53.9004,
00095 29.8293, 67.5528, 107.9350, 123.3455, 132.2378, 131.4797, 115.4431, 62.2663,
00096 40.8841, 83.6463, 107.8780, 93.3841, 89.2561, 99.7337, 104.0874, 62.3354,
00097 48.4106, 87.8455, 99.1077, 78.5041, 78.6037, 96.1159, 99.4878, 57.9593,
00098 52.9045, 87.6077, 89.6321, 73.1850, 81.8699, 100.9614, 95.5752, 52.1667,
00099 56.9858, 89.9411, 95.4289, 90.2053, 102.0447, 111.2012, 88.7520, 44.9451,
00100 62.3333, 103.9309, 132.7724, 139.7764, 137.4614, 115.8049, 74.0366, 40.6829,
00101 57.4817, 109.1016, 164.0325, 179.6707, 151.9472, 91.7439, 45.8780, 38.6118,
00102 38.0386, 79.1870, 130.8963, 146.5793, 112.9654, 51.5325, 21.9695, 30.2785,
00103 18.7358, 34.5346, 56.8801, 63.4289, 47.1443, 21.6321, 12.4309, 17.2154,
00104 12.7520, 14.3293, 16.7927, 17.2703, 14.6443, 11.9512, 11.4533, 11.5447
00105 };
00106
00107 const float digit1_data[] =
00108 {
00109 20.7563, 20.6311, 20.4518, 20.2995, 20.3046, 20.0846, 19.8477, 19.5601,
00110 11.6734, 12.8088, 16.8443, 19.6904, 17.9729, 13.4365, 11.2690, 10.7547,
00111 12.1049, 24.4890, 53.1421, 68.7597, 56.2707, 27.4416, 11.6971, 9.8799,
00112 14.3689, 41.3316, 103.9086, 139.8494, 115.9255, 52.8460, 14.5127, 10.3892,
00113 13.5584, 39.9645, 109.9628, 157.9052, 136.3164, 64.1117, 16.0000, 10.5228,
00114 11.5042, 29.8900, 85.2927, 133.0118, 117.7699, 57.0271, 15.2504, 9.8816,
00115 11.4755, 28.9865, 75.3621, 117.4755, 99.0338, 46.6379, 13.6988, 9.9729,
00116 12.2809, 36.2267, 83.7648, 117.2318, 86.4704, 36.5178, 11.5922, 10.4450,
00117 14.3773, 46.1591, 96.2470, 117.8731, 75.5804, 27.8731, 10.2876, 11.7073,
00118 18.3824, 55.8629, 105.4569, 114.7327, 65.8934, 21.9763, 9.9255, 13.8832,
00119 27.6041, 64.2115, 108.0017, 106.1861, 55.8748, 17.3570, 10.7496, 20.7868,
00120 38.8629, 67.6785, 100.1489, 88.9797, 43.3723, 13.8951, 12.0508, 28.5381,
00121 35.3249, 52.3401, 71.3113, 60.2589, 29.3350, 12.3621, 12.3706, 25.6870,
00122 20.8020, 26.6751, 33.8020, 29.0508, 17.5347, 11.6413, 12.0541, 17.4501,
00123 15.5330, 16.1269, 16.9712, 15.8257, 14.3130, 13.4535, 13.7563, 14.7817
00124 };
00125
00126 const float digit2_data[] =
00127 {
00128 14.8670, 15.2640, 15.4700, 15.1798, 14.8090, 13.9307, 13.7266, 13.7566,
00129 8.0300, 8.6180, 9.9288, 13.3427, 16.1479, 14.2978, 10.0169, 7.7472,
00130 7.7809, 9.7884, 24.1779, 51.2884, 68.2022, 59.5506, 32.6592, 11.1685,
00131 10.4251, 18.3858, 57.9382, 117.3820, 150.7659, 134.4326, 79.0506, 24.5693,
00132 17.1199, 37.9888, 87.7547, 143.1554, 171.2135, 158.8539, 106.4551, 40.4419,
00133 23.4607, 52.4738, 88.7715, 111.0712, 122.0843, 122.2865, 96.5524, 45.6461,
00134 19.9382, 39.4700, 59.4251, 70.7266, 83.8820, 92.2097, 75.5618, 37.0075,
00135 12.2453, 17.2659, 32.9045, 58.2303, 82.1142, 83.4906, 54.1629, 22.0543,
00136 9.9719, 16.5075, 39.1779, 68.0000, 80.1816, 62.7453, 29.5206, 11.5787,
00137 19.4925, 43.4906, 73.8352, 84.9831, 68.8708, 35.7622, 13.3109, 9.5487,
00138 54.8277, 101.4513, 136.4625, 133.4139, 95.3071, 45.1180, 18.0169, 17.3745,
00139 92.8390, 155.0206, 194.8801, 194.9438, 149.7828, 80.6105, 32.5599, 28.7734,
00140 82.7828, 134.5431, 169.7303, 173.8258, 137.3745, 77.3390, 31.6929, 27.4663,
00141 38.6873, 61.0375, 76.1910, 78.0843, 62.2884, 36.0169, 17.1704, 15.5843,
00142 13.4625, 17.3427, 19.8146, 19.8858, 17.2004, 12.7228, 10.6273, 10.4888
00143 };
00144
00145 const float digit3_data[] =
00146 {
00147 16.9937, 16.5577, 16.2264, 16.3249, 16.5577, 16.9623, 17.3166, 17.4088,
00148 9.8302, 10.0419, 12.2516, 16.7925, 20.1237, 20.0126, 17.0356, 12.9182,
00149 10.7296, 16.3899, 38.5346, 69.3543, 88.8910, 86.2914, 63.2180, 31.7652,
00150 13.6268, 26.3417, 72.9602, 138.2537, 180.0377, 178.0524, 129.6751, 59.8344,
00151 13.6709, 23.0021, 66.0419, 136.6960, 188.1845, 190.5639, 137.1090, 59.6981,
00152 11.7400, 13.9036, 42.3899, 101.9245, 148.3941, 144.1971, 92.5325, 35.0273,
00153 10.0314, 12.3270, 45.7317, 107.7002, 143.6981, 117.7547, 57.0671, 17.6226,
00154 9.6331, 14.2935, 54.3899, 123.0147, 155.0713, 123.1237, 55.2159, 15.5765,
00155 16.2662, 20.0273, 43.9895, 100.5702, 137.0377, 130.6205, 72.0922, 23.4612,
00156 37.0922, 42.4549, 42.5031, 73.2998, 107.0084, 123.4990, 81.0252, 33.1572,
00157 67.8616, 85.1195, 79.6813, 91.9078, 109.3711, 114.7254, 78.2264, 41.4004,
00158 82.2935, 117.5304, 132.6981, 142.1950, 134.8784, 104.9979, 64.3585, 44.3711,
00159 58.9078, 98.3270, 131.1069, 141.3396, 118.3229, 72.0210, 37.5241, 33.2096,
00160 25.9644, 47.4948, 68.6771, 73.7233, 57.4067, 30.8574, 16.7421, 17.7945,
00161 13.5556, 17.6918, 21.9057, 22.6604, 19.1279, 14.2872, 12.8616, 13.3627
00162 };
00163
00164 const float digit4_data[] =
00165 {
00166 14.2562, 14.5274, 14.8856, 14.8134, 15.0274, 15.1020, 15.2960, 15.7662,
00167 7.1891, 7.3159, 7.8930, 8.4328, 9.7537, 10.9055, 9.6990, 8.7363,
00168 7.8333, 7.0249, 9.7910, 21.0149, 35.1965, 38.0547, 23.0299, 10.7040,
00169 10.0498, 8.3507, 16.4726, 47.6841, 78.9826, 78.3433, 41.3532, 13.4403,
00170 10.6791, 13.5697, 37.4478, 81.3085, 104.2687, 83.5995, 36.8134, 11.6418,
00171 10.9055, 24.7836, 68.5920, 111.2736, 106.6343, 64.2985, 21.1119, 9.1617,
00172 18.5398, 47.0299, 97.0100, 125.8657, 107.7761, 65.4204, 23.2985, 11.7537,
00173 34.8507, 75.0224, 119.3010, 131.6891, 118.3010, 87.2139, 41.0547, 17.9254,
00174 63.1517, 115.0323, 152.2711, 153.4428, 136.6841, 101.4527, 49.2562, 19.9701,
00175 90.4279, 155.9552, 195.9627, 194.1244, 162.0771, 106.2537, 44.4925, 18.3483,
00176 80.0100, 132.6169, 176.6816, 190.1990, 165.8930, 100.8856, 37.7662, 19.4229,
00177 48.8234, 64.8159, 98.7289, 131.3582, 135.5920, 83.8507, 33.0796, 22.4403,
00178 25.6766, 20.9925, 35.5597, 63.3259, 80.5174, 53.1617, 23.4428, 17.5721,
00179 11.4502, 7.5224, 10.7687, 21.6294, 30.9080, 21.8955, 12.2662, 10.1219,
00180 8.0746, 7.7985, 8.5373, 10.5522, 11.9428, 9.8483, 8.6169, 8.2761
00181 };
00182
00183 const float digit5_data[] =
00184 {
00185 17.4672, 16.7822, 15.7743, 15.1916, 15.4908, 15.5696, 15.7480, 15.1391,
00186 9.4672, 9.8478, 11.5643, 15.8976, 19.2966, 19.0184, 15.7664, 10.9160,
00187 10.3701, 17.0630, 40.6430, 71.2362, 89.0052, 84.3832, 60.1732, 28.3491,
00188 13.7349, 32.8950, 88.7690, 150.7113, 180.0210, 166.0525, 115.0157, 51.0236,
00189 17.3438, 49.6535, 116.7874, 171.1260, 181.3780, 152.3701, 99.0341, 44.3727,
00190 20.8793, 62.8609, 131.4462, 164.2677, 147.4541, 101.0630, 51.0446, 23.2415,
00191 22.9239, 71.6719, 149.9265, 190.5328, 175.9843, 120.9081, 53.7087, 19.7848,
00192 24.8084, 72.0157, 145.4357, 194.3596, 196.3360, 156.8976, 85.1365, 30.5144,
00193 26.9160, 58.0210, 97.8766, 130.9764, 147.5328, 143.1260, 97.5538, 42.4121,
00194 35.3570, 53.0289, 62.8136, 76.0262, 98.4803, 116.8793, 92.9370, 48.0420,
00195 55.4226, 75.2336, 82.9055, 88.0551, 102.7664, 109.9449, 84.2021, 48.9003,
00196 68.4672, 97.9633, 124.5879, 135.6824, 133.8005, 107.6562, 67.8268, 44.2861,
00197 50.1417, 81.0262, 120.1076, 137.3360, 123.3963, 79.1286, 39.5486, 29.8766,
00198 22.3806, 39.1549, 63.1969, 73.3596, 62.6299, 35.2441, 16.8661, 15.2073,
00199 12.4698, 15.6903, 20.9528, 22.8871, 20.2257, 14.0761, 11.2730, 11.2362
00200 };
00201
00202 const float digit6_data[] =
00203 {
00204 19.6437, 20.1782, 20.9080, 21.6063, 22.3621, 23.2644, 22.9626, 22.6408,
00205 11.6954, 11.0661, 11.8793, 17.6609, 28.8592, 35.5575, 27.6178, 17.3190,
00206 12.2098, 10.0086, 13.8075, 33.5661, 62.2385, 73.3190, 48.8994, 21.6810,
00207 13.9310, 11.4339, 24.4339, 63.2960, 99.4598, 97.0431, 54.8592, 20.4224,
00208 14.1753, 17.0776, 47.1638, 97.0920, 120.7011, 92.6293, 42.0632, 15.1121,
00209 13.5575, 31.7126, 89.7644, 145.1523, 145.9713, 91.5747, 32.3534, 13.1351,
00210 18.3103, 56.2040, 137.7213, 196.5862, 186.7902, 117.4397, 41.3046, 16.6408,
00211 34.0460, 84.3707, 155.3534, 196.4655, 190.1092, 138.9626, 65.0144, 26.4540,
00212 55.0805, 101.1523, 133.8247, 145.9109, 146.0977, 132.4713, 82.8793, 38.5891,
00213 72.6983, 106.6264, 105.1724, 99.1351, 104.9167, 115.5489, 85.0259, 43.7672,
00214 88.6494, 116.5690, 106.1408, 96.0603, 101.2040, 107.3506, 78.1466, 41.9425,
00215 91.5144, 124.5920, 136.3908, 135.2011, 126.2529, 98.6149, 58.2328, 34.8391,
00216 67.4598, 104.3678, 136.8678, 144.4310, 121.8822, 73.0460, 33.8333, 25.8046,
00217 31.5489, 52.0115, 72.9224, 77.9195, 62.7960, 35.2960, 17.5632, 16.3764,
00218 14.8017, 17.8017, 21.5287, 22.2126, 19.3333, 15.2328, 13.2672, 13.8678
00219 };
00220
00221 const float digit7_data[] =
00222 {
00223 19.7602, 20.0585, 19.6111, 19.2836, 19.1901, 18.9035, 18.8977, 18.3947,
00224 11.3655, 12.6462, 16.1959, 20.9269, 23.9620, 23.9298, 20.6520, 15.4591,
00225 12.7047, 22.6842, 46.2690, 70.4971, 85.3860, 85.4561, 69.1754, 42.6023,
00226 18.3918, 45.2602, 99.4298, 146.6930, 174.0409, 174.4591, 143.3684, 87.0175,
00227 24.0146, 59.6491, 120.6520, 164.0439, 190.2719, 192.9064, 163.0614, 100.4327,
00228 26.1257, 52.5585, 90.5702, 111.8918, 129.5643, 139.1959, 119.9269, 71.2661,
00229 20.4298, 31.9678, 51.3801, 70.8275, 93.6462, 105.3538, 81.6199, 40.7135,
00230 13.3509, 15.6842, 34.7105, 70.4474, 101.6404, 96.9649, 57.1491, 22.7749,
00231 10.7982, 15.6462, 45.6813, 91.4737, 112.4298, 81.9912, 34.5906, 14.2602,
00232 12.3538, 30.7544, 75.2047, 113.8860, 104.0205, 55.4064, 18.2895, 12.2632,
00233 26.5497, 55.8450, 100.4883, 116.8889, 79.8830, 29.9971, 10.6023, 14.6520,
00234 47.9532, 75.2222, 102.8480, 92.1959, 49.1579, 15.2982, 9.0234, 19.6257,
00235 47.6462, 65.3860, 76.6608, 56.6667, 25.7018, 9.4211, 8.7661, 19.1228,
00236 25.3041, 32.0234, 35.0029, 25.2953, 13.5994, 8.1725, 8.3304, 12.9064,
00237 12.6345, 13.2047, 13.3392, 11.9035, 10.4094, 9.5380, 9.9971, 10.9357
00238 };
00239
00240 const float digit8_data[] =
00241 {
00242 15.9933, 16.0269, 16.0269, 15.5387, 15.2424, 15.3199, 15.9495, 16.5859,
00243 8.9091, 8.7071, 9.5455, 12.2424, 15.7879, 16.1582, 13.2256, 10.4882,
00244 8.9293, 8.7542, 17.9764, 41.7104, 63.5455, 63.6296, 41.9966, 16.6229,
00245 12.0135, 15.2525, 43.3603, 99.4108, 143.5522, 142.8586, 97.9731, 36.4714,
00246 16.3266, 31.1852, 77.6229, 140.3535, 183.2256, 182.2357, 134.8418, 57.8249,
00247 18.8148, 48.7845, 109.1077, 164.7845, 192.8889, 184.6970, 136.3468, 62.1347,
00248 17.8519, 57.0673, 133.9697, 199.4310, 219.4074, 193.2828, 123.8956, 50.1785,
00249 22.9057, 68.8788, 148.1481, 210.1785, 220.6566, 187.0034, 107.3670, 40.0438,
00250 40.8451, 89.4007, 141.0943, 170.5084, 177.0808, 159.5859, 101.4646, 44.4512,
00251 59.0606, 101.5118, 124.3131, 127.0202, 138.8451, 142.9158, 107.3569, 54.9226,
00252 70.7542, 107.3973, 128.5556, 133.2997, 148.2795, 143.8990, 104.8384, 54.2963,
00253 73.5859, 111.7643, 151.3737, 173.0303, 176.6128, 139.5118, 82.6128, 40.7542,
00254 52.8855, 87.4343, 133.5017, 159.4613, 150.0438, 100.1077, 47.2761, 25.0572,
00255 23.6229, 40.9024, 65.8283, 78.2391, 69.6768, 42.7071, 19.6296, 14.1987,
00256 12.0000, 14.9697, 19.3535, 21.1818, 19.4545, 14.7138, 11.8215, 11.9630
00257 };
00258
00259 const float digit9_data[] =
00260 {
00261 15.8852, 15.9519, 15.8407, 15.2185, 15.0259, 15.2667, 16.0259, 17.1630,
00262 9.1815, 8.7333, 9.3222, 12.5519, 15.2963, 14.7778, 11.5741, 9.8741,
00263 10.0037, 11.8778, 26.8370, 53.5593, 70.6148, 62.6259, 36.0889, 14.2926,
00264 14.7630, 25.4037, 67.5667, 124.2667, 155.8000, 138.0704, 83.8926, 28.9185,
00265 26.3741, 53.9185, 106.3556, 153.8889, 177.2296, 163.3556, 115.7296, 47.6444,
00266 38.5370, 81.2148, 126.6630, 142.4370, 146.9667, 141.5333, 115.4778, 56.6815,
00267 36.9593, 89.9778, 146.3963, 164.2074, 160.8926, 139.5889, 100.6037, 47.8889,
00268 26.1667, 78.4593, 157.2778, 204.8444, 204.6000, 154.4963, 81.1444, 30.4074,
00269 14.9593, 48.1000, 126.2037, 191.1778, 194.7630, 133.3852, 53.6667, 17.5407,
00270 10.7481, 31.6667, 94.1741, 149.9593, 144.4148, 85.7852, 27.7296, 13.0296,
00271 25.6556, 50.4259, 97.5630, 124.3593, 97.2296, 44.7000, 14.4407, 15.2222,
00272 49.1370, 72.4481, 100.9667, 98.2259, 57.6963, 20.5296, 10.2704, 18.3037,
00273 46.0000, 57.6000, 68.3074, 58.2037, 29.4037, 11.5852, 9.1296, 15.4037,
00274 23.6185, 25.8148, 27.3444, 22.9593, 13.7889, 8.9630, 8.6481, 11.1444,
00275 12.8667, 12.9556, 12.9370, 11.7741, 10.5407, 9.6148, 9.9852, 10.9630
00276 };
00277
00278 struct racestats
00279 {
00280 racestats() : lag(0.0), position(0.0), n(0) {}
00281
00282 std::string info() const
00283 {
00284 return sformat("lag = %+.2f, position = %.2f, in %d frames",
00285 lag / n, 1.0 + position / n, n);
00286 }
00287
00288 double lag;
00289 double position;
00290 int n;
00291 };
00292 }
00293
00294 int main(const int argc, const char** argv)
00295 {
00296 ModelManager manager("parse-need-for-speed");
00297
00298 nub::ref<InputFrameSeries> ifs(new InputFrameSeries(manager));
00299 manager.addSubComponent(ifs);
00300
00301 if (manager.parseCommandLine(argc, argv, "dodisplay", 1, 1) == false)
00302 return 1;
00303
00304 manager.start();
00305
00306 const Dims zoomdims(121,69);
00307
00308 const int rows[] = { 86, 104, 122, 140 };
00309 const int cols[] = { 562, 554, 544, 536, 528 };
00310 const Dims digitdims(8,15);
00311 const int ilabcol = 539;
00312 const Dims ilabdims(31,15);
00313
00314 const Image<float> ILAB(&ILAB_data[0], ilabdims);
00315 const Image<float> digits[10] =
00316 {
00317 Image<float>(&digit0_data[0], digitdims),
00318 Image<float>(&digit1_data[0], digitdims),
00319 Image<float>(&digit2_data[0], digitdims),
00320 Image<float>(&digit3_data[0], digitdims),
00321 Image<float>(&digit4_data[0], digitdims),
00322 Image<float>(&digit5_data[0], digitdims),
00323 Image<float>(&digit6_data[0], digitdims),
00324 Image<float>(&digit7_data[0], digitdims),
00325 Image<float>(&digit8_data[0], digitdims),
00326 Image<float>(&digit9_data[0], digitdims)
00327 };
00328
00329 const bool dodisplay = manager.getExtraArgAs<bool>(0);
00330
00331 XWinManaged* fullwin = 0;
00332 XWinManaged* zoomwin = 0;
00333
00334 if (dodisplay)
00335 {
00336 fullwin = new XWinManaged(Dims(640,480), -1, -1, "full");
00337 zoomwin = new XWinManaged(Dims(zoomdims.w() * 4, zoomdims.h() * 2),
00338 -1, -1, "zoom");
00339 }
00340
00341 const double ilabthresh = 0.75;
00342
00343 const double confthresh = 0.84;
00344
00345 std::vector<racestats> stats;
00346
00347 int ngap = 0;
00348
00349 ifs->startStream();
00350
00351 while (true)
00352 {
00353 ifs->updateNext();
00354
00355 const Image<PixRGB<byte> > rgb = ifs->readRGB();
00356 if (!rgb.initialized())
00357 {
00358 LINFO("input exhausted; quitting");
00359 break;
00360 }
00361
00362 const Image<float> im = luminance(Image<PixRGB<float> >(rgb));
00363
00364 const Image<PixRGB<byte> > im2 = crop(rgb, Point2D<int>(453, 86), zoomdims);
00365
00366 Image<PixRGB<byte> > guesses(im2.getDims() * 2, ZEROS);
00367 const PixRGB<byte> confcol(255, 255, 0);
00368 const PixRGB<byte> shakycol(128, 128, 128);
00369 const PixRGB<byte> bgcol(0, 0, 0);
00370
00371 std::string labels[4];
00372 double lags[4];
00373 int position = -1;
00374
00375 double worstcorr = 1.0;
00376
00377 bool seenilab = false;
00378
00379 for (int row = 0; row < 4; ++row)
00380 {
00381 const Image<float> ilabpatch = crop(im, Point2D<int>(ilabcol, rows[row]),
00382 ilabdims);
00383
00384 const double ilabcorr = sqrt(corrcoef(ILAB, ilabpatch));
00385
00386 if (ilabcorr > ilabthresh)
00387 {
00388 labels[row] = sformat("ilab (ilabcorr=%.4f)", ilabcorr);
00389 lags[row] = 0.0;
00390
00391 if (dodisplay)
00392 {
00393 writeText(guesses, Point2D<int>(1, 6+row*36),
00394 sformat("ILAB (conf=%.4f)", ilabcorr).c_str(),
00395 ilabcorr >= confthresh ? confcol : shakycol, bgcol);
00396 }
00397
00398 if (ilabcorr < worstcorr)
00399 worstcorr = ilabcorr;
00400
00401 seenilab = true;
00402 position = row;
00403 }
00404 else
00405 {
00406 double val = 0;
00407
00408 double totalcorr = 0.0;
00409
00410 for (int col = 4; col >= 0; --col)
00411 {
00412 const Image<float> patch = crop(im, Point2D<int>(cols[col], rows[row]),
00413 digitdims);
00414
00415 const double patchmean = mean(patch);
00416
00417 double maxcorr = -1.0;
00418 int bestdigit = -1;
00419
00420 if (patchmean < 25.0)
00421 LINFO("row %d, col %d patch mean = %.4f", row, col, patchmean);
00422 else
00423 for (int d = 0; d <= 9; ++d)
00424 {
00425 const double c = sqrt(corrcoef(patch, digits[d]));
00426 if (c > maxcorr)
00427 {
00428 maxcorr = c;
00429 bestdigit = d;
00430 }
00431 }
00432
00433 int guessdigit = bestdigit;
00434
00435 if (maxcorr < 0.7)
00436 guessdigit = 0;
00437
00438 for (int p = 0; p < col; ++p)
00439 guessdigit *= 10;
00440
00441 val = val + guessdigit;
00442
00443 if (col <= 2)
00444 totalcorr += maxcorr;
00445 }
00446
00447 totalcorr /= 3.0;
00448
00449 val /= 100.0;
00450
00451 if (!seenilab)
00452 val *= -1.0;
00453
00454 labels[row] = sformat("%+.2f (ilabcorr=%.4f, 3corr=%.4f)",
00455 val, ilabcorr, totalcorr);
00456 lags[row] = val;
00457
00458 if (dodisplay)
00459 writeText(guesses, Point2D<int>(1, 6+row*36),
00460 sformat("%+.2f (conf=%.4f)",
00461 val, totalcorr).c_str(),
00462 totalcorr >= confthresh ? confcol : shakycol, bgcol);
00463
00464 if (totalcorr < worstcorr)
00465 worstcorr = totalcorr;
00466 }
00467 }
00468
00469 if (dodisplay)
00470 {
00471 fullwin->drawImage(rgb, 0, 0);
00472 Image<PixRGB<byte> > zoomimg =
00473 concatX(intXY(im2, true), guesses);
00474
00475 writeText(zoomimg, Point2D<int>(1,1),
00476 sformat("%06d", ifs->frame()).c_str(),
00477 PixRGB<byte>(0,255,255), PixRGB<byte>(0,0,0),
00478 SimpleFont::FIXED(6), true);
00479 zoomwin->drawImage(zoomimg, 0, 0);
00480
00481 std::cout << sformat("frame %06d", ifs->frame()) << ":\n";
00482
00483 for (int l = 0; l < 4; ++l)
00484 std::cout << sformat("\t%s", labels[l].c_str())
00485 << std::endl;
00486
00487 if (worstcorr < confthresh)
00488 std::cout << sformat("\tTRASHY!!! worst corr = %.4f", worstcorr)
00489 << std::endl;
00490 else
00491 std::cout << sformat("\tworst corr = %.4f", worstcorr)
00492 << std::endl;
00493 }
00494
00495 if (worstcorr >= confthresh)
00496 {
00497 const double currentlag =
00498 (lags[0] + lags[1] + lags[2] + lags[3]) / 4.0;
00499
00500 if (ngap > 40 || stats.size() == 0)
00501 stats.push_back(racestats());
00502
00503 stats.back().lag += currentlag;
00504 stats.back().position += position;
00505 stats.back().n++;
00506
00507 std::cout << sformat("%6d %+8.2f %3d %% worstcorr = %.2f stats[%"ZU"]: %s (gap=%d)\n",
00508 ifs->frame(), currentlag, position, worstcorr,
00509 stats.size(),
00510 stats.back().info().c_str(), ngap);
00511
00512 ngap = 0;
00513 }
00514 else
00515 {
00516 std::cout << sformat("%6d %8s %3s %% worstcorr = %.2f\n",
00517 ifs->frame(), "NaN", "NaN", worstcorr);
00518 ++ngap;
00519 }
00520
00521 }
00522 }
00523
00524
00525
00526
00527
00528
00529
00530
00531 #endif // APPMEDIA_APP_PARSE_NEED_FOR_SPEED_C_DEFINED