diff --git a/bob/ip/qualitymeasure/data/real_client001_android_SD_scene01.face b/bob/ip/qualitymeasure/data/real_client001_android_SD_scene01.face
new file mode 100755
index 0000000000000000000000000000000000000000..bce523310f9fc6f467173d0f3880e0aa11f14455
--- /dev/null
+++ b/bob/ip/qualitymeasure/data/real_client001_android_SD_scene01.face
@@ -0,0 +1,301 @@
+0, 283, 107, 500, 375, 330.62, 235.40, 437.58, 232.54
+1, 292, 109, 520, 367, 334.61, 233.83, 436.75, 232.13
+2, 283, 104, 512, 376, 329.54, 235.68, 436.84, 232.43
+3, 284, 109, 499, 374, 330.47, 235.79, 436.46, 232.24
+4, 281, 108, 497, 373, 330.09, 235.71, 436.66, 232.40
+5, 283, 100, 510, 371, 329.64, 235.59, 436.94, 231.64
+6, 287, 102, 519, 378, 330.88, 234.92, 437.30, 232.08
+7, 279, 105, 500, 376, 330.70, 235.84, 437.60, 232.44
+8, 285, 107, 508, 374, 329.97, 235.24, 437.23, 232.31
+9, 282, 105, 501, 375, 329.31, 235.91, 436.97, 232.52
+10, 290, 108, 512, 373, 330.55, 234.90, 436.83, 232.57
+11, 281, 102, 504, 379, 330.83, 235.72, 438.06, 232.53
+12, 278, 106, 498, 376, 331.35, 235.27, 437.81, 231.96
+13, 278, 104, 501, 379, 330.75, 235.30, 438.48, 231.51
+14, 284, 106, 504, 376, 330.70, 234.71, 437.98, 232.21
+15, 283, 105, 502, 375, 330.68, 235.36, 437.02, 232.38
+16, 288, 102, 517, 378, 330.70, 235.23, 437.32, 232.34
+17, 281, 105, 499, 375, 330.97, 235.02, 438.15, 231.67
+18, 283, 104, 505, 380, 331.14, 235.15, 437.72, 231.99
+19, 283, 105, 505, 376, 332.25, 236.46, 437.40, 232.29
+20, 283, 105, 500, 373, 332.27, 236.47, 437.33, 232.70
+21, 292, 104, 515, 373, 332.19, 235.57, 437.55, 232.82
+22, 281, 105, 499, 375, 331.53, 235.84, 438.90, 232.99
+23, 286, 109, 502, 374, 331.09, 236.09, 438.55, 232.85
+24, 281, 102, 504, 376, 330.62, 235.67, 438.13, 231.49
+25, 278, 104, 501, 377, 330.74, 235.11, 437.57, 231.56
+26, 283, 106, 501, 376, 330.56, 234.71, 438.14, 232.10
+27, 286, 102, 508, 377, 330.56, 234.68, 437.65, 231.32
+28, 286, 104, 508, 378, 331.22, 234.85, 438.08, 231.08
+29, 281, 102, 507, 379, 331.45, 234.83, 438.94, 230.85
+30, 281, 98, 510, 380, 331.54, 234.70, 439.48, 230.66
+31, 285, 103, 503, 374, 331.22, 234.81, 441.71, 232.00
+32, 283, 104, 503, 374, 331.39, 234.67, 439.82, 230.47
+33, 282, 105, 505, 378, 332.56, 235.14, 440.82, 231.67
+34, 282, 103, 507, 380, 332.86, 234.75, 440.81, 231.19
+35, 286, 103, 508, 377, 332.49, 234.76, 439.94, 231.12
+36, 283, 101, 511, 380, 332.06, 234.45, 439.63, 230.75
+37, 286, 103, 508, 376, 332.15, 234.62, 439.91, 231.76
+38, 289, 105, 505, 373, 332.26, 234.77, 439.79, 231.98
+39, 284, 100, 512, 381, 332.67, 234.76, 439.93, 230.63
+40, 290, 102, 518, 378, 332.92, 234.20, 440.21, 230.33
+41, 284, 101, 510, 379, 332.33, 234.40, 440.49, 230.80
+42, 286, 104, 507, 374, 331.13, 234.26, 438.62, 230.15
+43, 280, 105, 501, 376, 330.96, 234.01, 438.67, 230.06
+44, 282, 102, 504, 376, 331.59, 234.18, 438.91, 230.06
+45, 281, 102, 507, 378, 331.89, 234.53, 439.76, 230.65
+46, 282, 102, 504, 375, 331.75, 234.60, 438.71, 230.37
+47, 277, 102, 499, 374, 330.81, 233.35, 438.17, 229.72
+48, 281, 103, 504, 377, 331.47, 233.32, 438.86, 229.33
+49, 284, 102, 506, 376, 331.35, 233.47, 439.52, 229.56
+50, 282, 100, 505, 376, 331.34, 232.89, 439.23, 228.81
+51, 280, 100, 506, 377, 331.80, 233.33, 439.18, 228.95
+52, 284, 101, 506, 375, 331.31, 233.35, 439.00, 229.05
+53, 280, 100, 504, 377, 331.44, 233.62, 439.12, 229.45
+54, 285, 103, 506, 374, 332.13, 233.30, 440.20, 229.38
+55, 282, 101, 508, 378, 332.65, 232.48, 440.17, 228.42
+56, 284, 104, 505, 375, 332.34, 233.33, 439.93, 229.58
+57, 284, 103, 506, 375, 332.16, 233.61, 439.57, 229.27
+58, 283, 103, 505, 376, 332.32, 234.01, 440.63, 229.85
+59, 281, 103, 507, 380, 332.60, 234.32, 440.83, 230.66
+60, 280, 100, 509, 383, 333.15, 234.40, 441.21, 230.32
+61, 288, 103, 511, 378, 332.18, 234.02, 439.92, 230.38
+62, 288, 103, 511, 379, 332.26, 234.26, 440.05, 230.14
+63, 284, 104, 507, 379, 332.73, 234.55, 440.96, 230.21
+64, 284, 104, 507, 379, 332.73, 234.55, 440.96, 230.21
+65, 287, 105, 509, 378, 331.90, 234.24, 440.04, 230.74
+66, 291, 105, 516, 377, 331.55, 233.88, 438.97, 230.87
+67, 286, 105, 509, 378, 331.80, 234.27, 439.18, 231.02
+68, 291, 106, 516, 378, 331.64, 233.98, 438.98, 230.53
+69, 294, 109, 511, 373, 331.22, 234.12, 438.57, 230.43
+70, 283, 105, 502, 374, 331.46, 234.48, 439.19, 229.93
+71, 284, 105, 506, 379, 332.08, 234.02, 440.07, 230.33
+72, 280, 98, 514, 385, 332.43, 233.82, 439.56, 229.75
+73, 278, 101, 508, 383, 332.16, 234.61, 440.67, 230.40
+74, 279, 104, 507, 381, 332.41, 234.82, 440.26, 230.06
+75, 278, 101, 509, 384, 332.78, 234.45, 440.90, 230.22
+76, 281, 102, 509, 381, 333.03, 234.23, 441.39, 230.33
+77, 283, 103, 507, 380, 332.42, 234.14, 440.92, 230.16
+78, 283, 102, 511, 384, 333.30, 233.75, 440.71, 230.07
+79, 286, 104, 509, 379, 332.65, 234.48, 441.37, 230.48
+80, 284, 105, 506, 379, 333.44, 234.62, 442.29, 230.70
+81, 281, 105, 504, 380, 333.25, 234.87, 442.09, 230.66
+82, 287, 106, 509, 378, 332.44, 234.81, 441.20, 231.14
+83, 291, 102, 519, 379, 332.68, 235.43, 440.00, 231.27
+84, 288, 106, 509, 376, 333.92, 235.13, 441.70, 231.23
+85, 288, 102, 520, 381, 333.74, 234.46, 442.11, 230.91
+86, 277, 102, 506, 385, 333.62, 235.92, 441.69, 231.83
+87, 279, 107, 501, 381, 333.01, 235.89, 440.19, 231.39
+88, 279, 105, 505, 382, 332.29, 236.11, 440.12, 232.22
+89, 285, 108, 501, 375, 333.43, 235.72, 441.83, 231.86
+90, 287, 101, 517, 381, 334.12, 235.85, 441.43, 231.70
+91, 277, 103, 506, 382, 333.67, 234.88, 441.51, 230.92
+92, 282, 104, 508, 381, 333.10, 234.71, 441.14, 230.92
+93, 282, 104, 509, 382, 333.47, 234.68, 441.90, 230.69
+94, 287, 103, 516, 382, 334.72, 234.63, 443.94, 230.67
+95, 285, 105, 508, 379, 334.65, 234.46, 442.31, 231.09
+96, 287, 104, 512, 380, 333.70, 233.68, 441.33, 230.45
+97, 289, 106, 510, 377, 334.18, 234.70, 442.05, 231.06
+98, 289, 103, 515, 380, 334.30, 235.18, 443.32, 231.51
+99, 278, 89, 531, 392, 333.53, 235.30, 441.89, 231.39
+100, 283, 102, 511, 381, 332.87, 235.61, 441.77, 231.61
+101, 274, 98, 508, 387, 334.27, 235.26, 442.38, 231.60
+102, 291, 100, 509, 369, 334.16, 235.41, 442.79, 231.69
+103, 285, 106, 508, 379, 334.40, 234.95, 442.68, 231.08
+104, 292, 108, 513, 374, 333.61, 235.19, 442.32, 231.37
+105, 292, 109, 513, 375, 334.61, 234.97, 443.08, 231.26
+106, 280, 101, 508, 382, 334.25, 235.89, 441.91, 231.48
+107, 293, 109, 512, 373, 334.10, 235.13, 442.97, 231.06
+108, 298, 109, 510, 373, 333.81, 235.40, 442.41, 231.09
+109, 285, 98, 519, 385, 333.67, 235.40, 442.04, 231.70
+110, 286, 96, 538, 384, 335.81, 234.28, 441.38, 230.95
+111, 288, 99, 537, 384, 335.14, 235.01, 441.20, 231.76
+112, 278, 97, 513, 386, 333.38, 235.37, 443.04, 231.42
+113, 291, 109, 508, 375, 334.45, 235.19, 443.25, 231.37
+114, 287, 107, 504, 375, 334.42, 235.37, 444.04, 231.57
+115, 294, 104, 522, 372, 334.23, 235.05, 443.11, 232.14
+116, 281, 88, 546, 391, 335.70, 236.18, 441.54, 232.00
+117, 285, 95, 522, 388, 333.39, 235.46, 442.39, 231.67
+118, 291, 109, 507, 374, 334.52, 235.42, 443.73, 231.72
+119, 292, 107, 507, 371, 334.86, 235.25, 443.58, 231.03
+120, 294, 108, 511, 373, 334.51, 235.03, 443.81, 231.13
+121, 268, 104, 494, 381, 334.16, 234.02, 441.63, 230.45
+122, 284, 104, 505, 375, 333.46, 234.41, 441.81, 230.12
+123, 281, 105, 503, 376, 332.77, 234.01, 441.94, 230.12
+124, 283, 103, 506, 378, 332.67, 233.81, 442.29, 229.96
+125, 285, 104, 507, 375, 333.63, 233.40, 442.29, 229.13
+126, 284, 103, 506, 375, 333.88, 233.04, 442.28, 228.78
+127, 284, 100, 508, 376, 333.30, 232.74, 442.43, 228.72
+128, 283, 101, 507, 377, 332.88, 233.31, 442.05, 228.93
+129, 287, 105, 506, 374, 333.81, 233.56, 442.43, 229.06
+130, 286, 103, 509, 375, 333.88, 233.46, 442.00, 228.71
+131, 280, 102, 506, 379, 333.14, 233.15, 442.20, 229.13
+132, 285, 104, 508, 375, 334.32, 233.86, 442.59, 229.20
+133, 290, 98, 513, 371, 334.23, 232.96, 442.09, 229.28
+134, 281, 101, 506, 378, 334.47, 233.15, 442.27, 228.66
+135, 281, 101, 505, 377, 334.79, 233.65, 443.28, 228.98
+136, 278, 101, 507, 381, 334.93, 233.75, 443.71, 229.44
+137, 283, 103, 506, 376, 334.32, 234.20, 442.42, 229.36
+138, 282, 102, 506, 378, 334.06, 233.55, 442.18, 229.35
+139, 280, 100, 508, 379, 334.56, 233.81, 442.62, 229.42
+140, 282, 100, 510, 381, 335.76, 233.69, 444.04, 229.42
+141, 283, 102, 510, 379, 335.25, 233.47, 443.86, 229.04
+142, 286, 102, 509, 376, 334.03, 233.31, 442.87, 228.96
+143, 281, 102, 505, 377, 334.32, 233.81, 442.56, 228.89
+144, 283, 99, 511, 380, 335.13, 234.01, 443.02, 229.51
+145, 284, 100, 512, 379, 335.00, 234.02, 443.37, 229.09
+146, 283, 101, 508, 378, 334.58, 233.76, 443.21, 229.30
+147, 281, 99, 509, 378, 334.54, 234.09, 442.80, 228.46
+148, 281, 99, 511, 382, 335.59, 233.89, 444.02, 229.32
+149, 281, 100, 509, 380, 334.51, 233.69, 443.07, 229.14
+150, 291, 101, 515, 378, 334.20, 233.93, 443.49, 228.88
+151, 282, 99, 510, 381, 335.40, 233.59, 444.68, 229.12
+152, 281, 102, 505, 378, 334.48, 234.26, 442.63, 229.33
+153, 281, 96, 514, 379, 334.40, 234.33, 443.27, 228.61
+154, 279, 98, 512, 382, 335.58, 233.98, 443.99, 229.10
+155, 284, 99, 512, 380, 336.00, 234.30, 444.30, 229.81
+156, 282, 101, 510, 382, 335.31, 234.60, 443.87, 230.04
+157, 283, 102, 508, 379, 335.52, 234.57, 444.02, 229.81
+158, 286, 103, 509, 378, 336.44, 234.66, 445.23, 229.80
+159, 285, 101, 512, 377, 336.25, 235.24, 444.43, 230.10
+160, 282, 102, 509, 378, 335.68, 234.43, 445.17, 229.99
+161, 282, 101, 508, 378, 336.25, 234.19, 444.53, 229.74
+162, 283, 101, 511, 379, 335.97, 234.04, 445.75, 229.73
+163, 278, 99, 510, 383, 335.77, 234.16, 444.67, 229.24
+164, 281, 98, 511, 381, 335.70, 233.81, 444.28, 229.15
+165, 291, 100, 520, 378, 335.91, 233.62, 445.09, 229.34
+166, 288, 93, 530, 382, 336.46, 233.50, 445.10, 228.53
+167, 295, 97, 524, 380, 336.68, 233.33, 445.43, 229.04
+168, 284, 98, 513, 380, 336.05, 233.39, 445.72, 228.77
+169, 288, 94, 528, 383, 336.27, 232.93, 444.79, 228.72
+170, 286, 98, 517, 381, 336.97, 233.66, 445.57, 229.32
+171, 289, 93, 529, 384, 336.71, 233.29, 445.48, 228.87
+172, 287, 91, 528, 384, 336.12, 233.34, 445.04, 228.51
+173, 285, 96, 519, 383, 336.56, 233.40, 445.40, 229.22
+174, 291, 96, 525, 382, 337.03, 233.34, 445.93, 228.84
+175, 287, 97, 519, 382, 337.54, 233.58, 446.36, 229.27
+176, 280, 92, 520, 386, 336.63, 233.24, 445.94, 228.54
+177, 284, 98, 515, 381, 336.80, 233.32, 445.88, 228.57
+178, 284, 97, 514, 380, 337.09, 233.60, 446.28, 228.94
+179, 283, 96, 517, 385, 337.74, 233.40, 447.29, 229.06
+180, 277, 92, 517, 387, 337.07, 233.56, 446.05, 228.31
+181, 283, 96, 517, 383, 337.25, 233.54, 446.38, 228.84
+182, 284, 94, 519, 383, 337.49, 233.57, 446.59, 228.97
+183, 280, 98, 514, 385, 337.74, 233.76, 447.16, 229.24
+184, 284, 95, 518, 384, 337.91, 233.56, 446.81, 229.14
+185, 285, 95, 519, 383, 337.96, 233.11, 446.81, 228.88
+186, 285, 98, 515, 381, 337.30, 233.79, 446.75, 229.05
+187, 287, 96, 520, 381, 337.64, 233.33, 446.95, 228.90
+188, 285, 94, 519, 383, 337.90, 233.51, 446.99, 228.83
+189, 285, 95, 519, 383, 337.39, 233.66, 446.89, 228.85
+190, 287, 96, 519, 381, 337.38, 233.60, 446.88, 229.32
+191, 279, 93, 519, 386, 337.79, 233.96, 446.68, 228.78
+192, 289, 94, 530, 382, 336.77, 233.56, 445.88, 228.85
+193, 285, 94, 519, 383, 337.74, 233.23, 446.80, 228.64
+194, 282, 100, 513, 383, 339.24, 233.62, 448.73, 229.16
+195, 294, 97, 526, 380, 339.03, 234.25, 448.39, 229.68
+196, 284, 97, 517, 382, 338.77, 233.92, 448.02, 229.07
+197, 287, 99, 516, 382, 338.55, 233.81, 447.62, 229.49
+198, 287, 101, 515, 379, 337.59, 233.41, 447.21, 228.96
+199, 286, 102, 512, 379, 337.57, 234.47, 447.02, 229.76
+200, 288, 101, 514, 377, 338.35, 234.15, 448.00, 229.13
+201, 302, 100, 526, 374, 338.20, 233.10, 448.23, 227.88
+202, 291, 92, 532, 379, 336.52, 232.06, 446.78, 227.12
+203, 292, 92, 534, 380, 336.58, 232.53, 446.19, 227.48
+204, 297, 99, 522, 375, 336.96, 233.18, 446.60, 228.36
+205, 287, 100, 514, 377, 337.51, 233.81, 446.55, 228.40
+206, 287, 98, 516, 379, 336.71, 233.54, 445.86, 228.17
+207, 295, 96, 526, 379, 336.55, 233.16, 446.12, 227.71
+208, 287, 99, 515, 378, 336.68, 233.26, 445.91, 227.93
+209, 287, 98, 517, 380, 335.93, 233.45, 444.88, 228.18
+210, 284, 98, 514, 380, 335.22, 233.62, 444.24, 228.41
+211, 293, 98, 524, 380, 335.93, 233.72, 445.22, 228.62
+212, 284, 98, 514, 381, 336.22, 233.56, 445.02, 228.32
+213, 284, 97, 515, 380, 335.45, 233.40, 444.38, 227.81
+214, 288, 99, 516, 379, 335.42, 233.52, 444.63, 228.32
+215, 283, 97, 517, 382, 335.61, 233.83, 445.47, 228.10
+216, 291, 96, 526, 385, 336.21, 234.13, 446.08, 228.86
+217, 294, 98, 523, 381, 335.75, 234.73, 445.18, 229.24
+218, 282, 100, 515, 383, 335.26, 234.45, 445.12, 229.13
+219, 293, 98, 523, 381, 334.63, 234.75, 444.11, 229.31
+220, 287, 100, 516, 381, 335.19, 234.90, 444.76, 229.61
+221, 284, 96, 520, 384, 336.24, 234.26, 445.58, 229.08
+222, 284, 96, 519, 384, 336.14, 234.45, 445.27, 229.12
+223, 285, 97, 520, 384, 335.72, 234.28, 444.58, 228.98
+224, 286, 91, 527, 384, 335.23, 234.52, 444.81, 228.35
+225, 282, 96, 519, 385, 335.34, 234.91, 444.89, 229.27
+226, 290, 97, 525, 381, 335.25, 234.77, 444.68, 229.22
+227, 285, 101, 513, 380, 335.49, 235.24, 444.87, 229.47
+228, 278, 99, 513, 386, 336.16, 235.14, 445.82, 229.04
+229, 277, 100, 512, 386, 336.98, 235.19, 446.54, 229.40
+230, 281, 100, 515, 386, 336.94, 235.16, 446.24, 229.04
+231, 281, 98, 516, 387, 336.80, 235.55, 445.96, 229.59
+232, 288, 101, 516, 380, 336.23, 235.81, 445.85, 230.04
+233, 286, 102, 514, 381, 336.12, 235.99, 445.60, 230.35
+234, 290, 100, 522, 382, 335.83, 235.34, 445.02, 229.92
+235, 283, 97, 518, 384, 336.15, 235.13, 445.43, 229.28
+236, 284, 97, 518, 385, 336.43, 235.00, 445.80, 229.26
+237, 288, 101, 516, 381, 337.01, 234.73, 446.14, 229.10
+238, 284, 100, 515, 382, 336.29, 235.33, 445.24, 230.08
+239, 284, 100, 516, 382, 335.95, 235.45, 444.44, 229.58
+240, 288, 99, 519, 381, 337.80, 236.53, 445.87, 229.71
+241, 289, 100, 519, 382, 338.46, 235.21, 444.86, 230.69
+242, 287, 99, 518, 381, 337.96, 234.76, 447.51, 229.84
+243, 286, 98, 521, 386, 337.58, 234.26, 447.05, 229.04
+244, 283, 99, 514, 382, 337.59, 234.63, 446.79, 228.77
+245, 297, 101, 522, 376, 337.30, 233.81, 447.51, 228.11
+246, 295, 96, 528, 378, 337.11, 233.16, 446.71, 227.75
+247, 292, 95, 521, 376, 336.54, 233.58, 445.85, 227.84
+248, 296, 93, 534, 376, 337.19, 233.52, 446.36, 227.02
+249, 295, 98, 524, 378, 337.02, 233.95, 446.39, 227.91
+250, 286, 97, 519, 381, 337.00, 233.31, 446.20, 228.07
+251, 284, 95, 521, 384, 336.50, 233.66, 445.59, 227.87
+252, 298, 98, 526, 380, 337.12, 233.51, 446.90, 228.01
+253, 299, 97, 529, 379, 337.36, 233.85, 447.40, 228.10
+254, 295, 96, 530, 381, 337.35, 233.66, 447.18, 228.44
+255, 287, 97, 521, 382, 337.38, 233.77, 446.19, 228.07
+256, 288, 96, 522, 382, 336.90, 233.37, 446.18, 227.72
+257, 299, 97, 528, 378, 336.65, 233.52, 446.74, 227.58
+258, 291, 97, 523, 380, 337.71, 233.64, 447.50, 228.00
+259, 292, 93, 529, 383, 337.59, 233.53, 447.63, 228.33
+260, 285, 96, 521, 385, 336.88, 234.35, 446.32, 228.44
+261, 284, 95, 520, 383, 336.20, 233.80, 445.83, 228.11
+262, 288, 99, 516, 377, 336.89, 233.44, 446.96, 228.20
+263, 299, 95, 536, 377, 338.63, 233.45, 447.55, 228.07
+264, 287, 100, 516, 378, 337.86, 233.67, 447.26, 228.29
+265, 287, 96, 522, 382, 337.24, 233.73, 446.84, 228.16
+266, 285, 96, 519, 383, 337.47, 233.98, 446.70, 228.60
+267, 297, 95, 533, 381, 338.52, 234.37, 447.65, 228.63
+268, 297, 97, 527, 379, 338.31, 233.88, 448.10, 228.23
+269, 288, 97, 519, 380, 337.31, 233.61, 446.64, 227.89
+270, 290, 96, 522, 380, 336.97, 233.14, 446.85, 227.62
+271, 290, 91, 530, 384, 336.93, 233.29, 446.37, 228.02
+272, 288, 98, 518, 380, 337.09, 233.50, 446.54, 227.78
+273, 288, 98, 520, 380, 337.49, 233.52, 447.02, 228.08
+274, 295, 94, 533, 379, 337.55, 233.62, 447.57, 228.06
+275, 297, 94, 531, 382, 337.18, 233.49, 446.70, 227.45
+276, 287, 98, 516, 379, 336.13, 233.21, 445.36, 227.70
+277, 289, 97, 519, 379, 336.29, 232.93, 445.55, 227.58
+278, 296, 98, 526, 378, 336.87, 232.99, 446.29, 227.78
+279, 300, 98, 529, 377, 337.72, 233.34, 447.67, 227.80
+280, 300, 97, 528, 378, 338.07, 233.67, 447.46, 228.43
+281, 285, 98, 519, 383, 336.79, 233.70, 446.93, 228.48
+282, 284, 96, 519, 384, 336.15, 233.59, 445.54, 228.23
+283, 287, 96, 521, 383, 337.14, 233.61, 446.82, 228.44
+284, 297, 93, 535, 381, 338.47, 234.11, 448.19, 227.79
+285, 298, 92, 538, 380, 338.70, 233.97, 447.77, 227.98
+286, 296, 93, 539, 381, 338.27, 234.25, 447.64, 228.10
+287, 292, 92, 530, 383, 338.36, 233.50, 446.95, 228.76
+288, 290, 98, 521, 380, 337.69, 233.44, 447.08, 228.10
+289, 288, 99, 516, 379, 337.42, 233.59, 446.47, 228.16
+290, 289, 98, 521, 380, 337.55, 233.71, 447.15, 228.27
+291, 299, 98, 528, 377, 337.29, 233.82, 447.31, 228.23
+292, 299, 97, 528, 377, 337.39, 233.65, 447.58, 228.37
+293, 285, 96, 520, 381, 337.76, 233.45, 446.66, 228.27
+294, 296, 96, 530, 379, 337.80, 233.62, 447.33, 228.36
+295, 291, 97, 524, 380, 337.97, 233.50, 447.42, 228.16
+296, 296, 96, 533, 378, 338.40, 233.49, 447.96, 228.05
+297, 293, 94, 530, 382, 337.26, 233.45, 446.51, 228.12
+298, 291, 96, 524, 380, 337.16, 233.41, 446.37, 227.91
+299, 290, 96, 523, 380, 337.66, 233.26, 447.44, 228.01
+300, 301, 97, 529, 376, 337.80, 233.55, 447.97, 227.77
diff --git a/bob/ip/qualitymeasure/data/real_client001_android_SD_scene01.mp4 b/bob/ip/qualitymeasure/data/real_client001_android_SD_scene01.mp4
new file mode 100755
index 0000000000000000000000000000000000000000..26f44879c3eea7638dd0d7d90189130c9f643cda
Binary files /dev/null and b/bob/ip/qualitymeasure/data/real_client001_android_SD_scene01.mp4 differ
diff --git a/bob/ip/qualitymeasure/galbally_iqm_features.py b/bob/ip/qualitymeasure/galbally_iqm_features.py
index a1aaa7bcc5d9a147e29ab914fffd2a481e91d9de..e91fb8ee0eb3b886b296094079b5d65bd33e3859 100644
--- a/bob/ip/qualitymeasure/galbally_iqm_features.py
+++ b/bob/ip/qualitymeasure/galbally_iqm_features.py
@@ -38,20 +38,26 @@ def compute_quality_features(image):
     "Image Quality Assessment for Fake Biometric Detection: Application to Iris, Fingerprint, and Face Recognition",
      IEEE Trans. on Image Processing Vol 23(2), 2014.
     """
-    
+    gray_image = None
+    #print("shape of input image:")
+    #print(image.shape)
     if len(image.shape) == 3:
         if(image.shape[0]==3): 
-            gray_image = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
+            gray_image = matlab_rgb2gray(image) #compute gray-level image for input color-frame
+            print(gray_image.shape)
         else:
             print('error. Wrong kind of input image')
     else:
         if len(image.shape) == 2:
             gray_image = image
+            print(gray_image.shape)
         else:
             print('error -- wrong kind of input')
 
-    gwin = gauss_2d((3,3), 0.5)
-    if gray_image: 
+    if gray_image is not None: 
+
+        gwin = gauss_2d((3,3), 0.5) # set up the smoothing-filter
+        print("computing degraded version of image")
         smoothed = ssg.convolve2d(gray_image, gwin, boundary='symm', mode='same') 
     
         """
@@ -61,6 +67,7 @@ def compute_quality_features(image):
         approach is that smoothing degrades a spoof-image more than it does a genuine image
         (see Galbally's paper referenced above).
         """
+        print("computing galbally quality features")
         featSet = image_quality_measures(gray_image, smoothed)
     
         return featSet
diff --git a/bob/ip/qualitymeasure/msu_iqa_features.py b/bob/ip/qualitymeasure/msu_iqa_features.py
index d776a97d521283dab59fe8d9dac2f1e4de4eac55..1c485efe95c3ca2a8c1e55005e05c99c70050796 100644
--- a/bob/ip/qualitymeasure/msu_iqa_features.py
+++ b/bob/ip/qualitymeasure/msu_iqa_features.py
@@ -91,12 +91,12 @@ def sobelEdgeMap(image, orientation='both'):
     refSobelX = refSobel_sep[0,:,:]
     refSobelY = refSobel_sep[1,:,:]
     if orientation is 'horizontal':
-        refEdge = iqm.edgeThinning(refSobelX[:,:], refSobelX[:,:], thinning)
+        refEdge = iqm.edge_thinning(refSobelX[:,:], refSobelX[:,:], thinning)
     else:
         if orientation is 'vertical':
-            refEdge = iqm.edgeThinning(refSobelY[:,:], refSobelY[:,:], thinning)
+            refEdge = iqm.edge_thinning(refSobelY[:,:], refSobelY[:,:], thinning)
         else:
-            refEdge = iqm.edgeThinning(refSobelX[:,:], refSobelY[:,:], thinning)
+            refEdge = iqm.edge_thinning(refSobelX[:,:], refSobelY[:,:], thinning)
             
 
     return refEdge
@@ -106,7 +106,8 @@ def sobelEdgeMap(image, orientation='both'):
 '''
 '''
 #def computeMsuIQAFeatures(rgbImage, printFV=False):
-def computeMsuIQAFeatures(rgbImage):
+def compute_msu_iqa_features(rgbImage):
+    print("computing msu iqa features")
     assert len(rgbImage.shape)==3, 'computeMsuIQAFeatures():: image should be a 3D array (containing a rgb image)'
 #     hsv = np.zeros_like(rgbImage)
 #     bob.ip.color.rgb_to_hsv(rgbImage, hsv)
@@ -115,7 +116,7 @@ def computeMsuIQAFeatures(rgbImage):
 #     v = hsv[2,:,:]
     h,s,v = matlab_rgb2hsv(rgbImage) #defined above. Calls Bob's rgb_to_hsv() after rescaling the input image.
     
-    #print "computeMsuIQAFeatures():: check bob.ip.color.rgb_to_hsv conversion"
+    #print "compute_msu_iqa_features():: check bob.ip.color.rgb_to_hsv conversion"
     grayImage = np.zeros_like(h, dtype='uint8')
     bob.ip.color.rgb_to_gray(rgbImage, grayImage)
     
@@ -147,7 +148,8 @@ def computeMsuIQAFeatures(rgbImage):
     momentFeats = np.hstack((momentFeats, momentFeatsV))
     
     fv = momentFeats.copy()
-    #print 'moment features:', fv
+    #print('moment features: ')
+    #print(fv)
     
     fv = np.hstack((fv, colorHist))
     fv = np.hstack((fv, totNumColors))
@@ -367,7 +369,7 @@ def rgbhist(image, maxval, nBins, normType=0):
     
     for i in range(0, numPix):          # for i=1:size(I,1)*size(I,2)
         p = (im[i,:]).astype(float)     # p = double(im(i,:));
-        p = np.floor(p/decimator)       # p = floor(p/(maxval/nBins))+1;
+        p = (np.floor(p/decimator)).astype(np.uint32)       # p = floor(p/(maxval/nBins))+1;
         H[p[0], p[1], p[2]] += 1        # H(p(1),p(2),p(3)) = H(p(1),p(2),p(3)) + 1;
                                         # end
     #totalNBins = np.prod(H.shape)
diff --git a/bob/ip/qualitymeasure/script/compute_iqm_features.py b/bob/ip/qualitymeasure/script/compute_iqm_features.py
deleted file mode 100644
index 92904d71a42af1628159a1c827f0d9ee81b1cdef..0000000000000000000000000000000000000000
--- a/bob/ip/qualitymeasure/script/compute_iqm_features.py
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/usr/bin/env python
-# vim: set fileencoding=utf-8 :
-
-'''
-Created on 13 Oct 2015
-
-@author: sbhatta
-'''
-
-import os, sys
-import argparse
-
-import bob.io.base
-import bob.io.video
-import bob.ip.color
-import numpy as np
-import galbally_iqm_features as iqm
-import antispoofing.utils.db as bobdb
-
-
-#'''
-#Matlab-like RGB to gray...
-#    @param: rgbImage : numpy array for the form: [3,h,w] where h is the height of the image and w is the width of the image.
-#    Returns a y-image in floating-point format (range [(16/255) .. (235/255)])
-#'''
-#def matlab_rgb2gray(rgbImage):
-#    #g1 = 0.299*rgbFrame[0,:,:] + 0.587*rgbFrame[1,:,:] + 0.114*rgbFrame[2,:,:] #standard coeffs CCIR601
-#    
-#    #this is how it's done in matlab...
-#    rgbImage = rgbImage / 255.0
-#    C0 = 65.481/255.0
-#    C1 = 128.553/255.0
-#    C2 = 24.966/255.0
-#    scaleMin = 16.0/255.0
-#    #scaleMax = 235.0/255.0
-#    gray = scaleMin + (C0*rgbImage[0,:,:] + C1*rgbImage[1,:,:] + C2*rgbImage[2,:,:])    
-#
-#    return gray
-
-
-# """
-# loads a video, and returns a feature-vector for each frame of video
-# """
-# def computeIQM_1video(vidPath):
-#     inputVideo = bob.io.video.reader(vidPath)
-#     vin = inputVideo.load()
-#     numframes = vin.shape[0]
-#     fset = np.zeros([numframes, 21])
-#     for f in range(numframes):
-#         rgbFrame = vin[f,:,:,:]
-#         grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
-#         bobQFeats = np.asarray(iqm.computeQualityFeatures(grayFrame)) # computeQualityFeatures() returns a tuple
-#         fset[f,:] = bobQFeats
-#     
-#     return fset
-#
-
-
-'''
-computes image-quality features for a set of frames comprising a video.
-    @param video4d: a '4d' video (N frames, each frame representing an r-g-b image).
-    returns  a set of feature-vectors, 1 vector per frame of video4d
-'''
-def computeVideoIQM(video4d):
-    numframes = video4d.shape[0]
-    
-    #process first frame separately, to get the no. of iqm features
-    f=0
-    rgbFrame = video4d[f,:,:,:]
-    grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
-    iqmSet = iqm.compute_quality_features(grayFrame)
-    numIQMs = len(iqmSet)
-    #now initialize fset to store iqm features for all frames of input video.
-    fset = np.zeros([numframes, numIQMs])
-    bobQFeats = np.asarray(iqmSet) # computeQualityFeatures() returns a tuple
-    fset[f,:] = bobQFeats
-    
-    for f in range(1,numframes):
-        rgbFrame = video4d[f,:,:,:]
-#        grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
-#        bobQFeats = np.asarray(iqm.compute_quality_features(grayFrame)) # computeQualityFeatures() returns a tuple
-        bobQFeats = np.asarray(iqm.compute_quality_features(rgbFrame)) # computeQualityFeatures() returns a tuple
-        fset[f,:] = bobQFeats
-    
-    return fset
-
-
-'''
-loads a video, and returns a feature-vector for each frame of video
-'''
-def computeIQM_1video(vidPath):
-    inputVideo = bob.io.video.reader(vidPath)
-    vin = inputVideo.load()
-    return computeVideoIQM(vin)
-    
-
-
-def main(command_line_parameters=None):
-    
-    #code for parsing command line args.
-    argParser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
-    argParser.add_argument('-f', '--print_num_files', action='store_true', dest='printNumFiles',
-      default=False, help='Option to print no. of files that will be processed. (Default: %(default)s)')
-    
-    argParser.add_argument('-i', '--input_videofile', dest='inpFile', default = None,
-       help='filename of video to be processed (including complete path). Video expected in .mov format.')
-    
-    argParser.add_argument('-o', '--output_featurefile', dest='outFile', default = None,
-       help='filename where computed features will be stored. Output file will be in hdf5 format.')
-    
-    args = argParser.parse_args(command_line_parameters)
-    #make sure the user specifies a folder where feature-files exist
-    if not args.inpFile: argParser.error('Specify parameter --input_videofile')
-    if not args.outFile: argParser.error('Specify parameter --output_featurefile')
-
-    #1. load video file
-    infile = args.inpFile #k.make_path(videoRoot, '.mov')
-    #2. compute features, 1 vector per frame of input video.
-    bobIqmFeats = computeIQM_1video(infile)
-    #3. save features in file 
-    outfile = args.outFile #k.make_path(featRoot, '.h5')
-    ohf = bob.io.base.HDF5File(outfile, 'w')
-    ohf.set('bobiqm', bobIqmFeats)
-    del ohf
-    
-
-if __name__ == '__main__':
-    main(sys.argv[1:])
diff --git a/bob/ip/qualitymeasure/script/compute_msuiqa_features.py b/bob/ip/qualitymeasure/script/compute_msuiqa_features.py
deleted file mode 100644
index 6addad0837d2853562d861da37fd6159a81f4e28..0000000000000000000000000000000000000000
--- a/bob/ip/qualitymeasure/script/compute_msuiqa_features.py
+++ /dev/null
@@ -1,240 +0,0 @@
-'''
-Created on 13 Oct 2015
-
-@author: sbhatta
-'''
-
-import os, sys
-import argparse
-
-import bob.io.base
-import bob.io.image #under the hood: loads Bob plugin for image file
-
-import bob.io.video
-import bob.ip.color
-import numpy as np
-import msu_iqa_features as iqa
-#import MSU_MaskedIQAFeats as iqa
-import antispoofing.utils.db as bobdb
-
-
-'''
-computes image-quality features for a set of frames comprising a video.
-    @param video4d: a '4d' video (N frames, each frame representing an r-g-b image).
-    returns  a set of feature-vectors, 1 vector per frame of video4d
-'''
-def computeVideoIQA(video4d, validFrames):
-    numframes = video4d.shape[0]
-    
-    #process first frame separately, to get the no. of iqm features
-    
-    numValidFrames = np.sum(validFrames)
-    k=0
-    while validFrames[k] == 0: k+=1
-    print 'first valid frame: ', k
-    rgbFrame = video4d[k,:,:,:]
-    
-    iqmSet = iqa.computeMsuIQAFeatures(rgbFrame)
-
-    numIQMs = len(iqmSet)
-    #now initialize fset to store iqm features for all frames of input video.
-    fset = np.zeros([numValidFrames, numIQMs])
-    msuQFeats = np.asarray(iqmSet) # computeQualityFeatures() returns a tuple
-    fset[0,:] = msuQFeats
-    print 'fset shape:', fset.shape
-    j=1
-    for f in range(k+1,numframes):
-        if validFrames[f]==1:
-            rgbFrame = video4d[f,:,:,:]
-            #grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
-            msuQFeats = np.asarray(iqa.computeMsuIQAFeatures(rgbFrame)) # computeQualityFeatures() returns a tuple
-            fset[j,:] = msuQFeats
-            #print j, f
-            j += 1
-            
-  
-    return fset
-
-
-'''
-loads a video, and returns a feature-vector for each frame of video
-'''
-def computeIQA_1video(videoFile, frameQualFile):
-    inputVideo = bob.io.video.reader(videoFile)
-    
-    #load input video
-    vin = inputVideo.load()
-    numFrames = vin.shape[0]
-    
-    
-    if frameQualFile is not None:
-        f = bob.io.base.HDF5File(frameQualFile) #read only
-        validFrames = (f.read('/frameQuality')).flatten() #reads list of frame-quality indicators
-        validFrames[np.where(validFrames <> 1)]=0
-    else:
-        validFrames = np.ones(numFrames)
-    #print validFrames
-#     print type(validFrames)
-    numValidFrames = np.sum(validFrames)
-    
-    print 'valid frames:', numValidFrames, 'of', numFrames
-    
-    #bob.io.base.save(vin[0,:,:,:].astype('uint8'), '/idiap/temp/sbhatta/msudb_colorImg.png')
-    
-    import time
-    startTime = time.time()
-    fset = computeVideoIQA(vin, validFrames)
-    print("Time for one video --- %s seconds ---" % (time.time() - startTime))
-    
-    return fset
-    
-
-'''
-'''
-def parse_arguments(arguments):
-        #code for parsing command line args.
-    argParser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
-
-#     # verbose
-    argParser.add_argument('-v', '--verbose', dest='verbose', metavar='INT', type=int, choices=[0, 1, 2], default=1,
-      help='Prints (hopefully helpful) messages  (Default: %(default)s)')
-    
-    argParser.add_argument('-db', '--dbase_path', dest='dbPath', default = None, #'/idiap/user/sbhatta/work/Antispoofing/ImageQualityMeasures',
-       help='path where database videos exist.')
-
-    argParser.add_argument('-op', '--output_path', dest='outPath', default = None,
-       help='path where face-files will be stored.')
-    
-    argParser.add_argument('-nf', '--numFiles', action='store_true', dest='numFiles',
-      default=False, help='Option to print no. of files that will be processed. (Default: %(default)s)')
-    
-    argParser.add_argument('-f', '--singleFile', dest='singleFile', default=None, 
-      help='filename (including complete path) of video to be used to test this code: %(default)s)')
-    
-    argParser.add_argument('-ve', '--video_ext', dest='vidExtn', default=None, choices = ['avi', 'mov', 'mp4'],
-      help='filename (including complete path) of video to be used to test this code: %(default)s)')
-    
-    
-    bobdb.Database.create_parser(argParser, implements_any_of='video')
-    args = argParser.parse_args(arguments)
-    
-    database = args.cls(args)
-   
-    if args.singleFile is None:
-        #make sure the user specifies a folder where feature-files exist
-        if not args.dbPath: argParser.error('Specify parameter --dbase_path')
-    else:
-        folder = os.path.dirname(args.singleFile)
-        filename = os.path.basename(args.singleFile)
-        args.dbPath = folder
-        args.singleFile = filename
-            
-    if not args.outPath: argParser.error('Specify parameter --output_path')
-        
-    return (args, database)
-
-
-'''
-'''
-def main(arguments):
-    
-    args, database = parse_arguments(arguments)
-    
-    inpDir = args.dbPath
-    outDir = args.outPath
-    assert os.path.exists(inpDir), "Input database folder %s does not exist" %inpDir
-    if args.verbose>0: print 'Loading data from',inpDir
-    
-    if args.singleFile is None:
-            
-        tr_realFiles, tr_attackFiles = database.get_train_data()
-        dv_realFiles, dv_attackFiles = database.get_devel_data()
-        ts_realFiles, ts_attackFiles = database.get_test_data()
-        allFiles = tr_realFiles + dv_realFiles + ts_realFiles + tr_attackFiles + dv_attackFiles + ts_attackFiles
-        del tr_realFiles, tr_attackFiles, dv_realFiles, dv_attackFiles, ts_realFiles, ts_attackFiles
-        
-        numFiles = len(allFiles)
-        if args.numFiles:
-            print 'Number of files to be processed:',numFiles
-            print 'exiting'
-            return
-        
-    #     print numFiles
-    #     numFiles = 1        #test
-        
-        # if we are on a grid environment, just find what I have to process.
-        fileSet = allFiles[0:numFiles]
-        if os.environ.has_key('SGE_TASK_ID'):
-            pos = int(os.environ['SGE_TASK_ID']) - 1
-            
-            if pos >= numFiles:
-                raise RuntimeError, "Grid request for job %d on a setup with %d jobs" % (pos, numFiles)
-            fileSet = [allFiles[pos]] # objects = [objects[pos]]
-
-        print 'processing', len(fileSet), ' files'
-        k1=0
-        for k in fileSet:
-            #1. load video file
-            print 'filenum:', k1
-    #         infile = k.make_path(videoRoot, '.avi')
-    #         outfile = k.make_path(featRoot, '.h5')
-            print k
-            if args.vidExtn is None:
-                inVidFile = k.videofile(inpDir)  #k.make_path(inpDir, '.avi')
-            else:
-                inVidFile = k.make_path(inpDir, ('.' + args.vidExtn))
-            inFrameQFile = None #k.make_path(inpDir, '_frameQ.h5')
-            outFeatFile = k.make_path(outDir, '.h5')
-            head, tail = os.path.split(outFeatFile)
-            if not os.path.exists(head): os.makedirs(head)      #create output folder, if it doesn't exist
-            
-            print inFrameQFile
-            print outFeatFile
-            
-    #         if True: #not os.path.isfile(outFeatFile):
-            msuIQAFeats = computeIQA_1video(inVidFile, inFrameQFile)
-    
-            #4. save features in file 
-            ohf = bob.io.base.HDF5File(outFeatFile, 'w')
-            ohf.set('msuiqa', msuIQAFeats)
-            del ohf
-            
-    #         assert 0>1, 'stop'
-            k1 += 1    
-    else:
-        # test feature-computation with a single file specified as input
-        filePart = os.path.splitext(args.singleFile)[0]
-        inVidFile = os.path.join(args.dbPath, filePart)+ '.avi'
-        inFrameQFile = os.path.join(args.dbPath, filePart)+ '_frameQ.h5'
-        
-        outFeatFile = os.path.join(outDir, filePart)+ '.h5'
-        head, tail = os.path.split(outFeatFile)
-        if not os.path.exists(head): os.makedirs(head)      #create output folder, if it doesn't exist
-            
-        print 'single file:', inVidFile
-        print inFrameQFile
-        print outFeatFile
-        
-        msuIQAFeats = computeIQA_1video(inVidFile, inFrameQFile)
-        #4. save features in file 
-        ohf = bob.io.base.HDF5File(outFeatFile, 'w')
-        ohf.set('msuiqa', msuIQAFeats)
-        del ohf
-
-# special fn to extract first frame from video-file and store it as hdf5
-def extractTestFrame():
-    videoFile = '/idiap/home/sbhatta/work/git/refactoring/bob.db.msu_mfsd_mod/bob/db/msu_mfsd_mod/test_images/real/real_client022_android_SD_scene01.mp4'
-    inputVideo = bob.io.video.reader(videoFile)
-    
-    #load input video
-    vin = inputVideo.load()
-    numFrames = vin.shape[0]
-    outframe = vin[0]
-    outfile = '/idiap/home/sbhatta/work/git/refactoring/bob.db.msu_mfsd_mod/bob/db/msu_mfsd_mod/test_images/real_client022_android_SD_scene01_frame0_correct.hdf5'
-    ohf = bob.io.base.HDF5File(outfile, 'w')
-    ohf.set('color_frame', outframe)
-    del ohf
-
-if __name__ == '__main__':
-#    extractTestFrame()
-    main(sys.argv[1:])
diff --git a/bob/ip/qualitymeasure/script/compute_qualitymeasures.py b/bob/ip/qualitymeasure/script/compute_qualitymeasures.py
new file mode 100644
index 0000000000000000000000000000000000000000..29b1cea260540deb1e05e8fa8a9aa4f50c5a2f0b
--- /dev/null
+++ b/bob/ip/qualitymeasure/script/compute_qualitymeasures.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python
+# vim: set fileencoding=utf-8 :
+
+'''
+Created on 08 Mar 2017
+
+@author: sbhatta
+'''
+
+import os, sys
+import argparse
+
+import bob.io.base
+import bob.io.video
+import bob.ip.color
+import numpy as np
+from bob.ip.qualitymeasure import galbally_iqm_features as iqm
+from bob.ip.qualitymeasure import msu_iqa_features as iqa
+
+
+def computeVideoIQM(video4d): 
+    '''computes image-quality features for a set of frames comprising a video.
+    @param video4d: a '4d' video (N frames, each frame representing an r-g-b image).
+    returns  a set of feature-vectors, 1 vector per frame of video4d
+    '''
+    numframes = video4d.shape[0]
+    numframes=3
+    #print(numframes)
+    
+    #process first frame separately, to get the no. of iqm features
+    f=0
+    #rgbFrame = video4d[f,:,:,:]
+    rgbFrame = video4d[f]
+    print(rgbFrame.shape)
+    iqmSet = iqm.compute_quality_features(rgbFrame)     #iqmSet = iqm.compute_quality_features(grayFrame)
+    numIQM = len(iqmSet)
+    iqaSet = iqa.compute_msu_iqa_features(rgbFrame)
+    numIQA = len(iqaSet)
+
+    #now initialize fset to store iqm features for all frames of input video.
+    bobfset = np.zeros([numframes, numIQM])
+    bobQFeats = np.asarray(iqmSet) # compute_quality_features() returns a tuple
+    bobfset[f] = bobQFeats
+    msufset = np.zeros([numframes, numIQA])
+    msuQFeats = np.asarray(iqaSet) 
+    msufset[f] = msuQFeats
+    
+    for f in range(1,numframes):
+        print('frame #: %d' %f)
+        rgbFrame = video4d[f]
+        print(rgbFrame.shape)
+#        grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
+#        bobQFeats = np.asarray(iqm.compute_quality_features(grayFrame)) # computeQualityFeatures() returns a tuple
+        bobQFeats = np.asarray(iqm.compute_quality_features(rgbFrame)) # computeQualityFeatures() returns a tuple
+        msuQFeats  = iqa.compute_msu_iqa_features(rgbFrame)
+        bobfset[f] = bobQFeats
+        msufset[f] = msuQFeats
+    
+    return (bobfset, msufset)
+
+
+def computeIQM_1video(vidPath):
+    """ loads a video, and returns 2 arrays of feature-vectors -- one per feature-family.
+    Each array contains one feature-vector per frame
+    """
+    #1. load video from input path
+    inputVideo = bob.io.video.reader(vidPath)
+    vin = inputVideo.load()
+    #2. compute and return feature-sets 
+    return computeVideoIQM(vin)
+    
+
+
+def main(command_line_parameters=None):
+    """Computes image-quality features for specified video-file, and stores the feature-arrays in specified output hdf5 file"""
+    
+    argParser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
+    argParser.add_argument('-i', '--input_videofile', dest='inpVidFile', default = None,
+       help='filename of video to be processed (including complete path). ')
+
+    argParser.add_argument('-o', '--output_featurefile', dest='outFile', default = None,
+       help='filename where computed features will be stored. Output file will be in hdf5 format.')
+    
+    args = argParser.parse_args(command_line_parameters)
+    #make sure the user specifies a folder where feature-files exist
+    if not args.inpVidFile: argParser.error('Specify parameter --input_videofile')
+    if not args.outFile: argParser.error('Specify parameter --output_featurefile')
+
+    #1. compute features, 1 vector per frame of input video, per feature-family (galbally,msu).
+    infile = args.inpVidFile
+    (bobIqmFeats, msuIqaFeats) = computeIQM_1video(infile)
+    #2. save features in file 
+    outfile = args.outFile
+    ohf = bob.io.base.HDF5File(outfile, 'w')
+    ohf.set('bobiqm', bobIqmFeats)
+    ohf.set('msuiqa', msuIqaFeats)
+    del ohf
+    
+
+if __name__ == '__main__':
+    main(sys.argv[1:])
diff --git a/setup.py b/setup.py
index 9a1298443a0d0f79b8af195393ec55f0e3674eee..e0151508df78a90e3667454e0aea21750a5f0134 100644
--- a/setup.py
+++ b/setup.py
@@ -34,7 +34,7 @@ setup(
     entry_points={
       # scripts should be declared using this entry:
       'console_scripts': [
-        'detect_landmarks.py = bob.ip.facelandmarks.script.detect_landmarks:main',
+        'compute_qualityfeatures.py = bob.ip.qualitymeasure.script.compute_qualitymeasures:main',
       ],
     },