2016-05-29 3 views
1

У меня проблема со скоростью фильтра верхней шляпы. В бумаге транзакций IEEE время работы верхней шляпы, примененной к изображению с разрешением 320 × 256, оценивается в 0,0062 секунды с помощью программного обеспечения MATLAB на ПК с 8-ГБ-памятью и 4-ГГц процессором Intel i7. table_time я запускаю следующий код с OpenCV на ноутбуке с памятью 6 ГБ и 2,6-ГГц процессор Intel i5 для этого изображения с таким же разрешением: enter image description hereверхняя часть фильтра время работы фильтра

#include <opencv2/core/core.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 
using namespace cv; 
using namespace std; 
int main(){ 
    double t0 = (double)getTickCount(); 
    Mat src,dst; 
    src=imread("E:/tree.jpg",0); 
    Mat element = getStructuringElement(MORPH_ELLIPSE,Size(15,15)); 
    morphologyEx(src,dst,MORPH_TOPHAT,element,Point(-1,-1)); 
    double elapsed=((double)getTickCount()-t0)/getTickFrequency(); 
    cout<<elapsed<<"second"<<"\n"; 
    return -1;} 

Это занимает .05375 секунду. Несмотря на то, что C++ и openCV бывают быстрыми, но почему время работы верха составляет 6 мс в matlab и 54 мс в opencv. как я мог ускорить его?

+0

Первый, почему вы включаете imread imread в времени пройти какое? Во-вторых, если вы используете opencl, то когда-то код компилируется во время выполнения при первом вызове, проверяемом ellpased time для второго вызова. Поскольку strukmen сказал check getbuild информацию, чтобы определить, какую версию opencv вы используете – LBerger

+0

Как уже упоминалось, вы измерили время чтения + время фильтрации. Как общий комментарий, время [benchmarking] (http://mattwarren.org/2014/09/19/the-art-of-benchmarking/) сложное, особенно с языками, использующими механизм высокого уровня, например, время сбор. Практически справедливое сравнение состоит в том, чтобы выполнить две программы (которые дают одинаковый результат) на одном компьютере и, кроме того, используя правильные эталонные методы для решения специфики языка. В общем, язык не имеет значения, только реализация. Это должно касаться того, почему. – Catree

ответ

1

Прежде всего, вы считаете загрузку изображения с диска, который обычно является самой медленной частью программы. Если вы хотите сравнить с бумагой, время будет работать только с тофором без каких-либо других целей.

Кроме того, есть много других вариантов компиляции, которые могут повлиять на это. Вы можете попытаться скомпилировать OpenCV со всеми видами оптимизации процессора, CUDA и т. Д., Которые могут иметь большой эффект.

1

вот мой результат теста на моем ноутбуке (Intel (R) _Core (TM) _i5-3230M_CPU _ @ _ 2.60GHz)

0,00129578 секунд !!

Я думаю, что самое главное, как вы скомпилировали OpenCV. есть много вариантов. я прикрепил мой вывод getBuildInformation()

тестового кода (улучшенная версия кода)

#include <opencv2/core/core.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 
using namespace cv; 
using namespace std; 
int main() { 

    Mat src, dst; 
    src = imread("tree.jpg", 0); 
    Mat element = getStructuringElement(MORPH_ELLIPSE, Size(15, 15)); 
    double elapsed = 0; 
    for (int i = 0; i < 100; i++) 
    { 
     double t0 = (double)getTickCount(); 
     morphologyEx(src, dst, MORPH_TOPHAT, element, Point(-1, -1)); 
     elapsed += ((double)getTickCount() - t0)/getTickFrequency(); 
    } 

    cout << elapsed/100 << " seconds" << "\n"; 
    cout << getBuildInformation(); 
    imshow("result", dst); 
    waitKey(); 
    return -1; 
} 

Выход тестового кода

0.00129578 seconds 

General configuration for OpenCV 3.1.0-dev ===================================== 
    Version control:    unknown 

    Extra modules: 
    Location (extra):   D:/git/opencv_contrib/modules 
    Version control (extra):  unknown 

    Platform: 
    Timestamp:     2016-05-27T19:59:05Z 
    Host:      Windows 10.0.10586 AMD64 
    CMake:      3.5.0-rc3 
    CMake generator:    Visual Studio 14 2015 Win64 
    CMake build tool:   C:/Program Files (x86)/MSBuild/14.0/bin/MSBuild.exe 
    MSVC:      1900 

    C/C++: 
    Built as dynamic libs?:  YES 
    C++ Compiler:    C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe (ver 19.0.23506.0) 
    C++ flags (Release):   /DWIN32 /D_WINDOWS /W4 /GR /EHa /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /arch:AVX /Oi /wd4251 /wd4324 /wd4275 /wd4589 /MP4 /MD /O2 /Ob2 /D NDEBUG 
    C++ flags (Debug):   /DWIN32 /D_WINDOWS /W4 /GR /EHa /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /arch:AVX /Oi /wd4251 /wd4324 /wd4275 /wd4589 /MP4 /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1 
    C Compiler:     C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe 
    C flags (Release):   /DWIN32 /D_WINDOWS /W3 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /arch:AVX /Oi /MP4 /MD /O2 /Ob2 /D NDEBUG 
    C flags (Debug):    /DWIN32 /D_WINDOWS /W3 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /arch:AVX /Oi /MP4 /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1 
    Linker flags (Release):  /machine:x64 /INCREMENTAL:NO 
    Linker flags (Debug):  /machine:x64 /debug /INCREMENTAL 
    Precompiled headers:   NO 
    Extra dependencies:   comctl32 gdi32 ole32 setupapi ws2_32 D:/git/pthreadVC2.lib 
    3rdparty dependencies:  zlib libjpeg libpng libtiff libjasper IlmImf libprotobuf 

    OpenCV modules: 
    To be built:     core flann imgproc ml photo reg surface_matching video dnn fuzzy imgcodecs shape videoio highgui objdetect plot superres ts xobjdetect xphoto bgsegm bioinspired cvblobslib dpm face features2d line_descriptor saliency text calib3d ccalib datasets rgbd stereo structured_light videostab xfeatures2d ximgproc aruco optflow stitching tracking ayvos java 
    Disabled:     world contrib_world 
    Disabled by dependency:  - 
    Unavailable:     cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev python2 python3 viz cvv hdf matlab sfm 

    Windows RT support:   NO 

    GUI: 
    QT:       NO 
    Win32 UI:     YES 
    OpenGL support:    NO 
    VTK support:     NO 

    Media I/O: 
    ZLib:      build (ver 1.2.8) 
    JPEG:      build (ver 90) 
    WEBP:      NO 
    PNG:       build (ver 1.6.19) 
    TIFF:      build (ver 42 - 4.0.2) 
    JPEG 2000:     build (ver 1.900.1) 
    OpenEXR:      build (ver 1.7.1) 
    GDAL:      NO 

    Video I/O: 
    Video for Windows:   NO 
    DC1394 1.x:     NO 
    DC1394 2.x:     NO 
    FFMPEG:      YES (prebuilt binaries) 
     codec:      YES (ver 56.41.100) 
     format:     YES (ver 56.36.101) 
     util:      YES (ver 54.27.100) 
     swscale:     YES (ver 3.1.101) 
     resample:     NO 
     gentoo-style:    YES 
    GStreamer:     NO 
    OpenNI:      NO 
    OpenNI PrimeSensor Modules: NO 
    OpenNI2:      NO 
    PvAPI:      NO 
    GigEVisionSDK:    NO 
    DirectShow:     YES 
    Media Foundation:   NO 
    XIMEA:      NO 
    Intel PerC:     NO 

    Parallel framework:   Concurrency 

    Other third-party libraries: 
    Use IPP:      NO 
    Use IPP Async:    NO 
    Use Eigen:     NO 
    Use Cuda:     NO 
    Use OpenCL:     YES 
    Use custom HAL:    NO 

    OpenCL:      <Dynamic loading of OpenCL library> 
    Include path:    D:/git/opencv/3rdparty/include/opencl/1.2 
    Use AMDFFT:     NO 
    Use AMDBLAS:     NO 

    Python 2: 
    Interpreter:     C:/Python27/python.exe (ver 2.7.11) 

    Python 3: 
    Interpreter:     NO 

    Python (for build):   C:/Python27/python.exe 

    Java: 
    ant:       C:/Program Files/apache-ant/bin/ant.bat (ver 1.9.6) 
    JNI:       C:/Program Files/Java/jdk1.8.0_74/include C:/Program Files/Java/jdk1.8.0_74/include/win32 C:/Program Files/Java/jdk1.8.0_74/include 
    Java wrappers:    YES 
    Java tests:     NO 

    Matlab:      NO 

    Tests and samples: 
    Tests:      NO 
    Performance tests:   YES 
    C/C++ Examples:    YES 

    Install path:     D:/opencv-build/install 

    cvconfig.h is in:    D:/opencv-build 
----------------------------------------------------------------- 
+0

Это число означает почти ничего в этом случае. Различные машины, нет информации о том, как они сравнивались или какие параметры они использовали. Я не сомневаюсь, что OpenCV должен быть таким же быстрым, как Matlab, если не быстрее, но я хочу подчеркнуть, что сначала трудно сделать правильный тест, особенно с [JVM-языком] (http://www.oracle.com/technetwork/articles /java/architect-benchmarking-2266277.html), а во-вторых, в большинстве случаев реализация имеет большее значение, чем язык программирования. Моя вторая точка является общей, поскольку OpenCV построен с хорошей производительностью в компьютерном зрении. – Catree

Смежные вопросы