1
+ // This file is part of OpenCV project.
2
+ // It is subject to the license terms in the LICENSE file found in the top-level directory
3
+ // of this distribution and at http://opencv.org/license.html.
4
+
5
+ #include < opencv2/imgproc.hpp>
6
+ #include < opencv2/highgui.hpp>
7
+ #include " precomp.hpp"
8
+ #include < vector>
9
+ #include < functional>
10
+ #include < cmath>
11
+ #include < string>
12
+ #include < iostream>
13
+ #include < cstdlib>
14
+ #include < algorithm>
15
+ #include < utility>
16
+ #include < numeric>
17
+ #include < fstream>
18
+
19
+
20
+
21
+ using namespace std ;
22
+ using namespace cv ;
23
+ using namespace cv ::saliency;
24
+
25
+ namespace cv
26
+ {
27
+ namespace saliency
28
+ {
29
+ DiscriminantSaliency::DiscriminantSaliency ()
30
+ {
31
+ imgProcessingSize = Size (127 , 127 );
32
+ hiddenSpaceDimension = 10 ;
33
+ centerSize = 16 ;
34
+ windowSize = 96 ;
35
+ patchSize = 8 ;
36
+ temporalSize = 11 ;
37
+ CV_Assert ( hiddenSpaceDimension <= temporalSize && temporalSize <= (unsigned )imgProcessingSize.width * imgProcessingSize.height );
38
+ }
39
+
40
+ DiscriminantSaliency::~DiscriminantSaliency (){}
41
+
42
+ bool DiscriminantSaliency::computeSaliencyImpl ( InputArray image, OutputArray saliencyMap )
43
+ {
44
+ return true ;
45
+ }
46
+
47
+ vector<Mat> DiscriminantSaliency::saliencyMapGenerator ( const std::vector<Mat> img_sq)
48
+ {
49
+
50
+ return img_sq;
51
+ }
52
+
53
+ double DiscriminantSaliency::KLdivDT ( const Mat img_sq, DT& para_c, DT& para_w )
54
+ {
55
+ Mat MU_c = para_c.MU .clone ();// 1
56
+ Mat MU_w = para_w.MU .clone ();// 1
57
+ Mat S_c = para_c.S .clone ();// 1
58
+ Mat S_w = para_w.S .clone ();// 1
59
+ Mat Beta = ((para_w.S .inv ()) + Mat::ones (para_w.S .size (), CV_64F) / (para_w.VAR )).inv ();// 1
60
+ Mat Omega = -1 * para_w.Q .inv () * para_w.A ;// const
61
+ Mat Theta = (para_w.S .inv ()) + (para_w.A .t ()) * (para_w.Q .inv ()) * (para_w.A );// const
62
+ Mat Vc = para_w.C .t () * para_c.C * MU_c - MU_w;// 1
63
+
64
+ Mat U_w = para_w.A * para_w.S ;// 2
65
+ Mat H = Theta + Mat::ones (Theta.size (), CV_64F) / (para_w.VAR ) - Omega.t () * Beta * Omega;// 2
66
+ Mat G = -1 * Beta * Omega;// 2
67
+ MU_c *= para_c.A ;// 2
68
+ MU_w *= para_w.A ;// 2
69
+ S_c = para_c.A * S_c * para_c.A .t () + para_c.Q ;
70
+ S_w = para_w.A * S_w * para_w.A .t () + para_w.Q ;
71
+ /* Beta =
72
+
73
+
74
+ for ( unsigned i = 1; i < img_sq.size[1]; i++)
75
+ {
76
+
77
+ }
78
+ Mat Zc
79
+
80
+ Mat Gama*/
81
+ return 0 ;
82
+ }
83
+
84
+ void DiscriminantSaliency::dynamicTextureEstimator ( const Mat img_sq, DT& para )
85
+ {
86
+
87
+ unsigned tau = img_sq.size [1 ]; // row represents pixel location and column represents temporal location
88
+ Mat me ( img_sq.size [0 ], 1 , CV_64F, Scalar::all (0.0 ) );
89
+ Mat temp ( img_sq.size [0 ], img_sq.size [1 ], CV_64F, Scalar::all (0.0 ) );
90
+ Mat X, V, B, W, Y;
91
+
92
+ for ( unsigned i = 0 ; i < tau; i++ )
93
+ {
94
+ me += img_sq.col (i) / tau;
95
+ }
96
+ temp += me * Mat::ones (1 , tau, CV_64F) * (-1 );
97
+ temp += img_sq;
98
+ Y = temp.clone ();
99
+
100
+ SVD s = SVD (temp, SVD::MODIFY_A);
101
+ para.C = s.u .colRange (0 , hiddenSpaceDimension);
102
+ para.C = para.C .clone ();
103
+ X = Mat::diag (s.w .rowRange (0 , hiddenSpaceDimension)) * s.vt .rowRange (0 , hiddenSpaceDimension);
104
+ para.A = (X.colRange (1 , tau) * (X.colRange (0 , tau - 1 )).inv ());
105
+ para.A = para.A .clone ();
106
+
107
+ V = (X.colRange (1 , tau) - para.A * X.colRange (0 , tau - 1 ));
108
+ V = V.clone ();
109
+ SVD sv = SVD (V, SVD::MODIFY_A);
110
+ B = sv.u * Mat::diag (sv.w ) / sqrt (tau - 1 );
111
+ para.Q = (B * B.t ());
112
+ para.Q = para.Q .clone ();
113
+
114
+ W = (Y - para.C * X);
115
+ W = W.clone ();
116
+ SVD sw = SVD (W, SVD::MODIFY_A);
117
+ B = sw.u * Mat::diag (sw.w ) / sqrt (tau - 1 );
118
+ para.R = (B * B.t ());
119
+ para.R = para.R .clone ();
120
+ para.VAR = (trace (para.R ) / para.R .size [0 ])[0 ];
121
+
122
+ para.MU = Mat ( hiddenSpaceDimension, 1 , CV_64F, Scalar::all (0.0 ) );
123
+ for (unsigned i = 0 ; i < tau; i++ )
124
+ {
125
+ para.MU += X.col (i) / tau;
126
+ }
127
+ para.S = (X - para.MU * Mat::ones (1 , tau, CV_64F)) * ((X - para.MU * Mat::ones (1 , tau, CV_64F)).t ()) / (tau - 1 );
128
+ para.S = para.S .clone ();
129
+ }
130
+
131
+ }
132
+ }
0 commit comments