34 #ifndef __INCLUDE_MEDIA_CUT_H__
35 #define __INCLUDE_MEDIA_CUT_H__
38 #ifndef __INCLUDE_MIST_CONF_H__
42 #ifndef __INCLUDE_MIST_H__
46 #ifndef __INCLUDE_MIST_COLOR_H__
50 #ifndef __INCLUDE_MIST_COLOR_H__
54 #ifndef __INCLUDE_IO_VIDEO_H__
64 namespace __media_utility__
66 template <
class Array >
67 void __compute_histogram__(
const Array &img, array3< double > &hist )
69 typedef typename Array::size_type size_type;
73 size_type binR = 256 / hist.size1( );
74 size_type binG = 256 / hist.size2( );
75 size_type binB = 256 / hist.size3( );
77 for( size_type i = 0 ; i < img.size( ) ; i++ )
79 hist( img[ i ].r / binR, img[ i ].g / binG, img[ i ].b / binB ) += 1.0;
82 for( size_type i = 0 ; i < hist.size( ) ; i++ )
84 hist[ i ] /=
static_cast< double >( img.size( ) );
88 template <
class Histogram >
89 double __compute_similarity__(
const Histogram &hist1,
const Histogram &hist2 )
91 double ave1 = 1.0 / hist1.size( ), ave2 = 1.0 / hist2.size( );
92 double r = 0.0, s1 = 0.0, s2 = 0.0;
94 for(
size_t i = 0 ; i < hist1.size( ) ; i++ )
96 double h1 = hist1[ i ];
97 double h2 = hist2[ i ];
98 r += ( h1 - ave1 ) * ( h2 - ave2 );
99 s1 += ( h1 - ave1 ) * ( h1 - ave1 );
100 s2 += ( h2 - ave2 ) * ( h2 - ave2 );
103 return ( r / std::sqrt( s1 * s2 ) );
182 bool cut_detection(
video::decoder &iv, std::vector< int > &frame_indeces,
size_t red_bin = 8,
size_t green_bin = 8,
size_t blue_bin = 8,
double threshold_of_similarity = 0.95, ptrdiff_t number_of_between_frames = 30 )
184 typedef video::decoder::size_type size_type;
185 typedef video::decoder::difference_type difference_type;
190 difference_type frameNo = 0;
194 if( !iv.
read( img, frameNo ) )
199 const difference_type num_playback = 5;
200 histogram_type h[ 2 ], *hh =
new histogram_type[ num_playback ];
203 h[ 0 ].
resize( red_bin, green_bin, blue_bin );
204 h[ 1 ].resize( red_bin, green_bin, blue_bin );
206 for( difference_type i = 0 ; i < num_playback ; i++ )
208 hh[ i ].resize( red_bin, green_bin, blue_bin );
211 frame_indeces.push_back( static_cast< int >( frameNo ) );
213 __media_utility__::__compute_histogram__( img, h[ 0 ] );
216 for( difference_type i = 0 ; !iv.
is_eof( ) ; i++ )
218 if( !iv.
read( img, frameNo ) )
223 histogram_type &ch = h[ ( i + 1 ) % 2 ];
224 __media_utility__::__compute_histogram__( img, ch );
225 double sim1 = __media_utility__::__compute_similarity__( h[ 0 ], h[ 1 ] );
226 double sim2 = 1.0, sim = sim1;
228 if( i >= num_playback - 1 )
230 sim2 = __media_utility__::__compute_similarity__( ch, hh[ ( i + 1 ) % num_playback ] );
231 sim = ( sim1 + sim2 ) * 0.5;
234 hh[ ( i + 1 ) % num_playback ] = ch;
236 if( sim1 < threshold_of_similarity || sim2 < threshold_of_similarity )
238 difference_type oindx = frame_indeces.back( );
239 difference_type nindx = frameNo;
240 if( nindx < oindx + number_of_between_frames )
244 frame_indeces.back( ) =
static_cast< int >( nindx );
250 frame_indeces.push_back( static_cast< int >( nindx ) );
258 frame_indeces.push_back( static_cast< int >( iv.
frame_id( ) ) );
274 #endif // __INCLUDE_MEDIA_CUT_H__