Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
5512f91d
O
Opencv
项目概览
Greenplum
/
Opencv
10 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
5512f91d
编写于
2月 12, 2013
作者:
I
Ilya Lavrenov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
removed libstdc++ dependency
上级
b6e7aeab
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
283 addition
and
106 deletion
+283
-106
modules/highgui/src/cap_ffmpeg.cpp
modules/highgui/src/cap_ffmpeg.cpp
+53
-27
modules/highgui/src/cap_ffmpeg_impl.hpp
modules/highgui/src/cap_ffmpeg_impl.hpp
+185
-33
modules/highgui/test/test_ffmpeg.cpp
modules/highgui/test/test_ffmpeg.cpp
+45
-46
未找到文件。
modules/highgui/src/cap_ffmpeg.cpp
浏览文件 @
5512f91d
...
...
@@ -57,21 +57,42 @@ static CvCreateVideoWriter_Plugin icvCreateVideoWriter_FFMPEG_p = 0;
static
CvReleaseVideoWriter_Plugin
icvReleaseVideoWriter_FFMPEG_p
=
0
;
static
CvWriteFrame_Plugin
icvWriteFrame_FFMPEG_p
=
0
;
static
void
icvInitFFMPEG
(
void
)
static
cv
::
Mutex
_icvInitFFMPEG_mutex
;
class
icvInitFFMPEG
{
static
int
ffmpegInitialized
=
0
;
if
(
!
ffmpegInitialized
)
public:
static
void
Init
()
{
cv
::
AutoLock
al
(
_icvInitFFMPEG_mutex
);
static
icvInitFFMPEG
init
;
}
private:
#if defined WIN32 || defined _WIN32
HMODULE
icvFFOpenCV
;
~
icvInitFFMPEG
()
{
if
(
icvFFOpenCV
)
{
FreeLibrary
(
icvFFOpenCV
);
icvFFOpenCV
=
0
;
}
}
#endif
icvInitFFMPEG
()
{
#if defined WIN32 || defined _WIN32
const
char
*
module_name
=
"opencv_ffmpeg"
CVAUX_STR
(
CV_
VERSION_EPOCH
)
CVAUX_STR
(
CV_VERSION_MAJOR
)
CVAUX_STR
(
CV_VERSION_MINOR
)
CVAUX_STR
(
CV_
MAJOR_VERSION
)
CVAUX_STR
(
CV_MINOR_VERSION
)
CVAUX_STR
(
CV_SUBMINOR_VERSION
)
#if (defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __x86_64__)
"_64"
#endif
".dll"
;
static
HMODULE
icvFFOpenCV
=
LoadLibrary
(
module_name
);
icvFFOpenCV
=
LoadLibrary
(
module_name
);
if
(
icvFFOpenCV
)
{
icvCreateFileCapture_FFMPEG_p
=
...
...
@@ -93,18 +114,24 @@ icvInitFFMPEG(void)
icvWriteFrame_FFMPEG_p
=
(
CvWriteFrame_Plugin
)
GetProcAddress
(
icvFFOpenCV
,
"cvWriteFrame_FFMPEG"
);
if
(
icvCreateFileCapture_FFMPEG_p
==
NULL
||
icvReleaseCapture_FFMPEG_p
==
NULL
||
icvGrabFrame_FFMPEG_p
==
NULL
||
icvRetrieveFrame_FFMPEG_p
==
NULL
||
icvSetCaptureProperty_FFMPEG_p
==
NULL
||
icvGetCaptureProperty_FFMPEG_p
==
NULL
||
icvCreateVideoWriter_FFMPEG_p
==
NULL
||
icvReleaseVideoWriter_FFMPEG_p
==
NULL
||
icvWriteFrame_FFMPEG_p
==
NULL
)
#if 0
if( icvCreateFileCapture_FFMPEG_p != 0 &&
icvReleaseCapture_FFMPEG_p != 0 &&
icvGrabFrame_FFMPEG_p != 0 &&
icvRetrieveFrame_FFMPEG_p != 0 &&
icvSetCaptureProperty_FFMPEG_p != 0 &&
icvGetCaptureProperty_FFMPEG_p != 0 &&
icvCreateVideoWriter_FFMPEG_p != 0 &&
icvReleaseVideoWriter_FFMPEG_p != 0 &&
icvWriteFrame_FFMPEG_p != 0 )
{
printf("Successfully initialized ffmpeg plugin!\n");
}
else
{
fprintf
(
stderr
,
"Failed to load FFMPEG plugin: module handle=%p
\n
"
,
icvFFOpenCV
);
printf(
"Failed to load FFMPEG plugin: module handle=%p\n", icvFFOpenCV);
}
#endif
}
#elif defined HAVE_FFMPEG
icvCreateFileCapture_FFMPEG_p
=
(
CvCreateFileCapture_Plugin
)
cvCreateFileCapture_FFMPEG
;
...
...
@@ -117,13 +144,12 @@ icvInitFFMPEG(void)
icvReleaseVideoWriter_FFMPEG_p
=
(
CvReleaseVideoWriter_Plugin
)
cvReleaseVideoWriter_FFMPEG
;
icvWriteFrame_FFMPEG_p
=
(
CvWriteFrame_Plugin
)
cvWriteFrame_FFMPEG
;
#endif
ffmpegInitialized
=
1
;
}
}
}
;
class
CvCapture_FFMPEG_proxy
:
public
CvCapture
class
CvCapture_FFMPEG_proxy
:
public
CvCapture
{
public:
CvCapture_FFMPEG_proxy
()
{
ffmpegCapture
=
0
;
}
...
...
@@ -146,18 +172,18 @@ public:
unsigned
char
*
data
=
0
;
int
step
=
0
,
width
=
0
,
height
=
0
,
cn
=
0
;
if
(
!
ffmpegCapture
||
!
icvRetrieveFrame_FFMPEG_p
(
ffmpegCapture
,
&
data
,
&
step
,
&
width
,
&
height
,
&
cn
))
return
0
;
if
(
!
ffmpegCapture
||
!
icvRetrieveFrame_FFMPEG_p
(
ffmpegCapture
,
&
data
,
&
step
,
&
width
,
&
height
,
&
cn
))
return
0
;
cvInitImageHeader
(
&
frame
,
cvSize
(
width
,
height
),
8
,
cn
);
cvSetData
(
&
frame
,
data
,
step
);
return
&
frame
;
}
virtual
bool
open
(
const
char
*
filename
)
{
icvInitFFMPEG
::
Init
();
close
();
icvInitFFMPEG
();
if
(
!
icvCreateFileCapture_FFMPEG_p
)
return
false
;
ffmpegCapture
=
icvCreateFileCapture_FFMPEG_p
(
filename
);
...
...
@@ -190,8 +216,8 @@ CvCapture* cvCreateFileCapture_FFMPEG_proxy(const char * filename)
#endif
}
class
CvVideoWriter_FFMPEG_proxy
:
public
CvVideoWriter
class
CvVideoWriter_FFMPEG_proxy
:
public
CvVideoWriter
{
public:
CvVideoWriter_FFMPEG_proxy
()
{
ffmpegWriter
=
0
;
}
...
...
@@ -208,8 +234,8 @@ public:
}
virtual
bool
open
(
const
char
*
filename
,
int
fourcc
,
double
fps
,
CvSize
frameSize
,
bool
isColor
)
{
icvInitFFMPEG
::
Init
();
close
();
icvInitFFMPEG
();
if
(
!
icvCreateVideoWriter_FFMPEG_p
)
return
false
;
ffmpegWriter
=
icvCreateVideoWriter_FFMPEG_p
(
filename
,
fourcc
,
fps
,
frameSize
.
width
,
frameSize
.
height
,
isColor
);
...
...
modules/highgui/src/cap_ffmpeg_impl.hpp
浏览文件 @
5512f91d
...
...
@@ -328,28 +328,187 @@ void CvCapture_FFMPEG::close()
#define AVSEEK_FLAG_ANY 1
#endif
static
void
icvInitFFMPEG_internal
()
class
ImplMutex
{
static
volatile
bool
initialized
=
false
;
if
(
!
initialized
)
public:
ImplMutex
()
{
init
();
}
~
ImplMutex
()
{
destroy
();
}
void
init
();
void
destroy
();
void
lock
();
bool
trylock
();
void
unlock
();
struct
Impl
;
protected:
Impl
*
impl
;
private:
ImplMutex
(
const
ImplMutex
&
);
ImplMutex
&
operator
=
(
const
ImplMutex
&
m
);
};
#if defined WIN32 || defined _WIN32 || defined WINCE
struct
ImplMutex
::
Impl
{
void
init
()
{
InitializeCriticalSection
(
&
cs
);
refcount
=
1
;
}
void
destroy
()
{
DeleteCriticalSection
(
&
cs
);
}
void
lock
()
{
EnterCriticalSection
(
&
cs
);
}
bool
trylock
()
{
return
TryEnterCriticalSection
(
&
cs
)
!=
0
;
}
void
unlock
()
{
LeaveCriticalSection
(
&
cs
);
}
CRITICAL_SECTION
cs
;
int
refcount
;
};
#ifndef __GNUC__
static
int
_interlockedExchangeAdd
(
int
*
addr
,
int
delta
)
{
#if defined _MSC_VER && _MSC_VER >= 1500
return
(
int
)
_InterlockedExchangeAdd
((
long
volatile
*
)
addr
,
delta
);
#else
return
(
int
)
InterlockedExchangeAdd
((
long
volatile
*
)
addr
,
delta
);
#endif
}
#endif // __GNUC__
#elif defined __APPLE__
#include <libkern/OSAtomic.h>
struct
ImplMutex
::
Impl
{
void
init
()
{
sl
=
OS_SPINLOCK_INIT
;
refcount
=
1
;
}
void
destroy
()
{
}
void
lock
()
{
OSSpinLockLock
(
&
sl
);
}
bool
trylock
()
{
return
OSSpinLockTry
(
&
sl
);
}
void
unlock
()
{
OSSpinLockUnlock
(
&
sl
);
}
OSSpinLock
sl
;
int
refcount
;
};
#elif defined __linux__ && !defined ANDROID
struct
ImplMutex
::
Impl
{
void
init
()
{
pthread_spin_init
(
&
sl
,
0
);
refcount
=
1
;
}
void
destroy
()
{
pthread_spin_destroy
(
&
sl
);
}
void
lock
()
{
pthread_spin_lock
(
&
sl
);
}
bool
trylock
()
{
return
pthread_spin_trylock
(
&
sl
)
==
0
;
}
void
unlock
()
{
pthread_spin_unlock
(
&
sl
);
}
pthread_spinlock_t
sl
;
int
refcount
;
};
#else
struct
ImplMutex
::
Impl
{
void
init
()
{
pthread_mutex_init
(
&
sl
,
0
);
refcount
=
1
;
}
void
destroy
()
{
pthread_mutex_destroy
(
&
sl
);
}
void
lock
()
{
pthread_mutex_lock
(
&
sl
);
}
bool
trylock
()
{
return
pthread_mutex_trylock
(
&
sl
)
==
0
;
}
void
unlock
()
{
pthread_mutex_unlock
(
&
sl
);
}
pthread_mutex_t
sl
;
int
refcount
;
};
#endif
void
ImplMutex
::
init
()
{
impl
=
(
Impl
*
)
malloc
(
sizeof
(
Impl
));
impl
->
init
();
}
void
ImplMutex
::
destroy
()
{
impl
->
destroy
();
free
(
impl
);
impl
=
NULL
;
}
void
ImplMutex
::
lock
()
{
impl
->
lock
();
}
void
ImplMutex
::
unlock
()
{
impl
->
unlock
();
}
bool
ImplMutex
::
trylock
()
{
return
impl
->
trylock
();
}
static
int
LockCallBack
(
void
**
mutex
,
AVLockOp
op
)
{
ImplMutex
*
localMutex
=
reinterpret_cast
<
ImplMutex
*>
(
*
mutex
);
switch
(
op
)
{
case
AV_LOCK_CREATE
:
localMutex
=
reinterpret_cast
<
ImplMutex
*>
(
malloc
(
sizeof
(
ImplMutex
)));
localMutex
->
init
();
*
mutex
=
localMutex
;
if
(
!*
mutex
)
return
1
;
break
;
case
AV_LOCK_OBTAIN
:
localMutex
->
lock
();
break
;
case
AV_LOCK_RELEASE
:
localMutex
->
unlock
();
break
;
case
AV_LOCK_DESTROY
:
localMutex
->
destroy
();
free
(
localMutex
);
localMutex
=
NULL
;
break
;
}
return
0
;
}
static
ImplMutex
_mutex
;
static
bool
_initialized
=
false
;
class
InternalFFMpegRegister
{
public:
InternalFFMpegRegister
()
{
_mutex
.
lock
();
if
(
!
_initialized
)
{
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 13, 0)
avformat_network_init
();
avformat_network_init
();
#endif
/* register all codecs, demux and protocols */
av_register_all
();
/* register all codecs, demux and protocols */
av_register_all
();
/* register a callback function for synchronization */
av_lockmgr_register
(
&
LockCallBack
);
av_log_set_level
(
AV_LOG_ERROR
);
av_log_set_level
(
AV_LOG_ERROR
);
_initialized
=
true
;
}
_mutex
.
unlock
();
}
initialized
=
true
;
~
InternalFFMpegRegister
()
{
_initialized
=
false
;
av_lockmgr_register
(
NULL
);
}
}
};
static
InternalFFMpegRegister
_init
;
bool
CvCapture_FFMPEG
::
open
(
const
char
*
_filename
)
{
icvInitFFMPEG_internal
();
unsigned
i
;
bool
valid
=
false
;
...
...
@@ -361,7 +520,8 @@ bool CvCapture_FFMPEG::open( const char* _filename )
int
err
=
av_open_input_file
(
&
ic
,
_filename
,
NULL
,
0
,
NULL
);
#endif
if
(
err
<
0
)
{
if
(
err
<
0
)
{
CV_WARN
(
"Error opening file"
);
goto
exit_func
;
}
...
...
@@ -371,7 +531,8 @@ bool CvCapture_FFMPEG::open( const char* _filename )
#else
av_find_stream_info
(
ic
);
#endif
if
(
err
<
0
)
{
if
(
err
<
0
)
{
CV_WARN
(
"Could not find codec parameters"
);
goto
exit_func
;
}
...
...
@@ -383,17 +544,18 @@ bool CvCapture_FFMPEG::open( const char* _filename )
AVCodecContext
*
enc
=
&
ic
->
streams
[
i
]
->
codec
;
#endif
#ifdef FF_API_THREAD_INIT
avcodec_thread_init
(
enc
,
get_number_of_cpus
());
#else
//
#ifdef FF_API_THREAD_INIT
//
avcodec_thread_init(enc, get_number_of_cpus());
//
#else
enc
->
thread_count
=
get_number_of_cpus
();
#endif
//
#endif
#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0)
#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
#endif
if
(
AVMEDIA_TYPE_VIDEO
==
enc
->
codec_type
&&
video_stream
<
0
)
{
if
(
AVMEDIA_TYPE_VIDEO
==
enc
->
codec_type
&&
video_stream
<
0
)
{
AVCodec
*
codec
=
avcodec_find_decoder
(
enc
->
codec_id
);
if
(
!
codec
||
#if LIBAVCODEC_VERSION_INT >= ((53<<16)+(8<<8)+0)
...
...
@@ -401,7 +563,8 @@ bool CvCapture_FFMPEG::open( const char* _filename )
#else
avcodec_open
(
enc
,
codec
)
#endif
<
0
)
goto
exit_func
;
<
0
)
goto
exit_func
;
video_stream
=
i
;
video_st
=
ic
->
streams
[
i
];
...
...
@@ -1275,8 +1438,6 @@ void CvVideoWriter_FFMPEG::close()
bool
CvVideoWriter_FFMPEG
::
open
(
const
char
*
filename
,
int
fourcc
,
double
fps
,
int
width
,
int
height
,
bool
is_color
)
{
icvInitFFMPEG_internal
();
CodecID
codec_id
=
CODEC_ID_NONE
;
int
err
,
codec_pix_fmt
;
double
bitrate_scale
=
1
;
...
...
@@ -1495,6 +1656,7 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
frame_width
=
width
;
frame_height
=
height
;
ok
=
true
;
return
true
;
}
...
...
@@ -1506,6 +1668,7 @@ CvCapture_FFMPEG* cvCreateFileCapture_FFMPEG( const char* filename )
capture
->
init
();
if
(
capture
->
open
(
filename
))
return
capture
;
capture
->
close
();
free
(
capture
);
return
0
;
...
...
@@ -1554,7 +1717,6 @@ CvVideoWriter_FFMPEG* cvCreateVideoWriter_FFMPEG( const char* filename, int four
return
0
;
}
void
cvReleaseVideoWriter_FFMPEG
(
CvVideoWriter_FFMPEG
**
writer
)
{
if
(
writer
&&
*
writer
)
...
...
@@ -1745,11 +1907,6 @@ bool OutputMediaStream_FFMPEG::open(const char* fileName, int width, int height,
oc_
=
0
;
video_st_
=
0
;
// tell FFMPEG to register codecs
av_register_all
();
av_log_set_level
(
AV_LOG_ERROR
);
// auto detect the output format from the name and fourcc code
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
fmt_
=
av_guess_format
(
NULL
,
fileName
,
NULL
);
...
...
@@ -1930,11 +2087,6 @@ bool InputMediaStream_FFMPEG::open(const char* fileName, int* codec, int* chroma
avformat_network_init
();
#endif
// register all codecs, demux and protocols
av_register_all
();
av_log_set_level
(
AV_LOG_ERROR
);
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 6, 0)
err
=
avformat_open_input
(
&
ctx_
,
fileName
,
0
,
0
);
#else
...
...
@@ -2054,7 +2206,7 @@ bool InputMediaStream_FFMPEG::read(unsigned char** data, int* size, int* endOfFi
if
(
ret
<
0
)
{
if
(
ret
==
AVERROR_EOF
)
if
(
ret
==
(
int
)
AVERROR_EOF
)
*
endOfFile
=
true
;
return
false
;
}
...
...
modules/highgui/test/test_ffmpeg.cpp
浏览文件 @
5512f91d
...
...
@@ -207,7 +207,6 @@ public:
}
}
private:
std
::
vector
<
VideoWriter
*>*
writers
;
std
::
vector
<
std
::
string
>*
files
;
...
...
@@ -241,18 +240,18 @@ public:
virtual
void
operator
()
(
const
Range
&
range
)
const
{
if
((
range
.
start
+
1
)
!=
range
.
end
)
return
;
VideoWriter
*
writer
=
writers
->
operator
[](
range
.
start
);
CV_Assert
(
writer
!=
NULL
);
CV_Assert
(
writer
->
isOpened
());
Mat
frame
(
CreateVideoWriterInvoker
::
FrameSize
,
CV_8UC3
);
for
(
unsigned
int
i
=
0
;
i
<
FrameCount
;
++
i
)
for
(
int
j
=
range
.
start
;
j
<
range
.
end
;
++
j
)
{
GenerateFrame
(
frame
,
i
);
writer
->
operator
<<
(
frame
);
VideoWriter
*
writer
=
writers
->
operator
[](
j
);
CV_Assert
(
writer
!=
NULL
);
CV_Assert
(
writer
->
isOpened
());
Mat
frame
(
CreateVideoWriterInvoker
::
FrameSize
,
CV_8UC3
);
for
(
unsigned
int
i
=
0
;
i
<
FrameCount
;
++
i
)
{
GenerateFrame
(
frame
,
i
);
writer
->
operator
<<
(
frame
);
}
}
}
...
...
@@ -305,47 +304,47 @@ public:
virtual
void
operator
()
(
const
Range
&
range
)
const
{
if
((
range
.
start
+
1
)
!=
range
.
end
)
return
;
VideoCapture
*
capture
=
readers
->
operator
[](
range
.
start
);
CV_Assert
(
capture
!=
NULL
);
CV_Assert
(
capture
->
isOpened
());
for
(
int
j
=
range
.
start
;
j
<
range
.
end
;
++
j
)
{
VideoCapture
*
capture
=
readers
->
operator
[](
j
);
CV_Assert
(
capture
!=
NULL
);
CV_Assert
(
capture
->
isOpened
());
const
static
double
eps
=
23.0
;
unsigned
int
frameCount
=
static_cast
<
unsigned
int
>
(
capture
->
get
(
CV_CAP_PROP_FRAME_COUNT
));
CV_Assert
(
frameCount
==
WriteVideo_Invoker
::
FrameCount
);
Mat
reference
(
CreateVideoWriterInvoker
::
FrameSize
,
CV_8UC3
);
const
static
double
eps
=
23.0
;
unsigned
int
frameCount
=
static_cast
<
unsigned
int
>
(
capture
->
get
(
CV_CAP_PROP_FRAME_COUNT
));
CV_Assert
(
frameCount
==
WriteVideo_Invoker
::
FrameCount
);
Mat
reference
(
CreateVideoWriterInvoker
::
FrameSize
,
CV_8UC3
);
for
(
unsigned
int
i
=
0
;
i
<
frameCount
&&
next
;
++
i
)
{
Mat
actual
;
(
*
capture
)
>>
actual
;
for
(
unsigned
int
i
=
0
;
i
<
frameCount
&&
next
;
++
i
)
{
Mat
actual
;
(
*
capture
)
>>
actual
;
WriteVideo_Invoker
::
GenerateFrame
(
reference
,
i
);
WriteVideo_Invoker
::
GenerateFrame
(
reference
,
i
);
EXPECT_EQ
(
reference
.
cols
,
actual
.
cols
);
EXPECT_EQ
(
reference
.
rows
,
actual
.
rows
);
EXPECT_EQ
(
reference
.
depth
(),
actual
.
depth
());
EXPECT_EQ
(
reference
.
channels
(),
actual
.
channels
());
EXPECT_EQ
(
reference
.
cols
,
actual
.
cols
);
EXPECT_EQ
(
reference
.
rows
,
actual
.
rows
);
EXPECT_EQ
(
reference
.
depth
(),
actual
.
depth
());
EXPECT_EQ
(
reference
.
channels
(),
actual
.
channels
());
double
psnr
=
PSNR
(
actual
,
reference
);
if
(
psnr
<
eps
)
{
#define SUM cvtest::TS::SUMMARY
ts
->
printf
(
SUM
,
"
\n
PSNR: %lf
\n
"
,
psnr
);
ts
->
printf
(
SUM
,
"Video #: %d
\n
"
,
range
.
start
);
ts
->
printf
(
SUM
,
"Frame #: %d
\n
"
,
i
);
#undef SUM
ts
->
set_failed_test_info
(
cvtest
::
TS
::
FAIL_BAD_ACCURACY
);
ts
->
set_gtest_status
();
double
psnr
=
PSNR
(
actual
,
reference
);
if
(
psnr
<
eps
)
{
#define SUM cvtest::TS::SUMMARY
ts
->
printf
(
SUM
,
"
\n
PSNR: %lf
\n
"
,
psnr
);
ts
->
printf
(
SUM
,
"Video #: %d
\n
"
,
range
.
start
);
ts
->
printf
(
SUM
,
"Frame #: %d
\n
"
,
i
);
#undef SUM
ts
->
set_failed_test_info
(
cvtest
::
TS
::
FAIL_BAD_ACCURACY
);
ts
->
set_gtest_status
();
Mat
diff
;
absdiff
(
actual
,
reference
,
diff
);
Mat
diff
;
absdiff
(
actual
,
reference
,
diff
);
EXPECT_EQ
(
countNonZero
(
diff
.
reshape
(
1
)
>
1
),
0
);
EXPECT_EQ
(
countNonZero
(
diff
.
reshape
(
1
)
>
1
),
0
);
next
=
false
;
next
=
false
;
}
}
}
}
...
...
@@ -359,7 +358,7 @@ private:
bool
ReadImageAndTest
::
next
;
TEST
(
Highgui_Video_parallel_writers_and_readers
,
DISABLED_
accuracy
)
TEST
(
Highgui_Video_parallel_writers_and_readers
,
accuracy
)
{
const
unsigned
int
threadsCount
=
4
;
cvtest
::
TS
*
ts
=
cvtest
::
TS
::
ptr
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录