diff --git a/3rdparty/tbb/CMakeLists.txt b/3rdparty/tbb/CMakeLists.txt index 93d9435237..a76854d4a3 100644 --- a/3rdparty/tbb/CMakeLists.txt +++ b/3rdparty/tbb/CMakeLists.txt @@ -5,21 +5,26 @@ if (WIN32 AND NOT ARM) message(FATAL_ERROR "BUILD_TBB option supports Windows on ARM only!\nUse regular official TBB build instead of the BUILD_TBB option!") endif() -if (WIN32 AND ARM) - # 4.1 update 4 - The first release that supports Windows RT. Hangs on some Android devices - set(tbb_ver "tbb41_20130613oss") - set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130613oss_src.tgz") - set(tbb_md5 "108c8c1e481b0aaea61878289eb28b6a") - set(tbb_version_file "version_string.ver") - ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4702) -else() - # 4.1 update 2 - works fine - set(tbb_ver "tbb41_20130116oss") - set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130116oss_src.tgz") - set(tbb_md5 "3809790e1001a1b32d59c9fee590ee85") - set(tbb_version_file "version_string.ver") - ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow) -endif() +set(tbb_ver "tbb43_20141204oss") +set(tbb_url "http://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb43_20141204oss_src.tgz") +set(tbb_md5 "e903dd92d9433701f097fa7ca29a3c1f") +set(tbb_version_file "version_string.ver") +ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4702) +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow) + +# 4.1 update 4 - The first release that supports Windows RT. Hangs on some Android devices +#set(tbb_ver "tbb41_20130613oss") +#set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130613oss_src.tgz") +#set(tbb_md5 "108c8c1e481b0aaea61878289eb28b6a") +#set(tbb_version_file "version_string.ver") +#ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4702) + +# 4.1 update 2 - works fine +#set(tbb_ver "tbb41_20130116oss") +#set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130116oss_src.tgz") +#set(tbb_md5 "3809790e1001a1b32d59c9fee590ee85") +#set(tbb_version_file "version_string.ver") +#ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow) # 4.1 update 3 dev - Hangs on some Android devices #set(tbb_ver "tbb41_20130401oss") @@ -97,7 +102,7 @@ if(NOT EXISTS "${tbb_tarball}") message(STATUS "Downloading ${tbb_ver}_src.tgz") file(DOWNLOAD "${tbb_url}" "${tbb_tarball}" TIMEOUT 600 STATUS __statvar) if(NOT __statvar EQUAL 0) - message(FATAL_ERROR "Failed to download TBB sources: ${tbb_url}") + message(FATAL_ERROR "Failed to download TBB sources (${__statvar}): ${tbb_url}") endif() file(MD5 "${tbb_tarball}" tbb_local_md5) if(NOT tbb_local_md5 STREQUAL tbb_md5) @@ -153,6 +158,7 @@ if (WIN32) set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} /APPCONTAINER") else() add_definitions(-D__TBB_DYNAMIC_LOAD_ENABLED=0 #required + -D__TBB_WEAK_SYMBOLS_PRESENT=0 #required for 4.3 -D__TBB_BUILD=1 #required -D__TBB_SURVIVE_THREAD_SWITCH=0 #no cilk support -DTBB_USE_DEBUG=0 #just to be sure diff --git a/CMakeLists.txt b/CMakeLists.txt index 05696527d5..9fe44dea0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -598,6 +598,9 @@ if(HAVE_CUDA) if(HAVE_CUFFT) set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${CUDA_cufft_LIBRARY}) endif() + foreach(p ${CUDA_LIBS_PATH}) + set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} -L${p}) + endforeach() endif() # ---------------------------------------------------------------------------- # Solution folders: diff --git a/apps/traincascade/cascadeclassifier.cpp b/apps/traincascade/cascadeclassifier.cpp index 8b3eb57ac5..beef815b61 100644 --- a/apps/traincascade/cascadeclassifier.cpp +++ b/apps/traincascade/cascadeclassifier.cpp @@ -206,7 +206,7 @@ bool CvCascadeClassifier::train( const string _cascadeDirName, cout << endl << "===== TRAINING " << i << "-stage =====" << endl; cout << "& else grayscaleImage = image.getMat(); + if (grayscaleImage.type() != CV_8UC1) { + CV_Error(Error::StsUnsupportedFormat, "Blob detector only supports 8-bit images!"); + } + std::vector < std::vector
> centers; for (double thresh = params.minThreshold; thresh < params.maxThreshold; thresh += params.thresholdStep) { diff --git a/modules/stitching/src/matchers.cpp b/modules/stitching/src/matchers.cpp index 2587da914c..40988b9888 100644 --- a/modules/stitching/src/matchers.cpp +++ b/modules/stitching/src/matchers.cpp @@ -220,7 +220,11 @@ void GpuMatcher::match(const ImageFeatures &features1, const ImageFeatures &feat descriptors1_.upload(features1.descriptors); descriptors2_.upload(features2.descriptors); - Ptr matcher = cuda::DescriptorMatcher::createBFMatcher(NORM_L2); + //TODO: NORM_L1 allows to avoid matcher crashes for ORB features, but is not absolutely correct for them. + // The best choice for ORB features is NORM_HAMMING, but it is incorrect for SURF features. + // More accurate fix in this place should be done in the future -- the type of the norm + // should be either a parameter of this method, or a field of the class. + Ptr matcher = cuda::DescriptorMatcher::createBFMatcher(NORM_L1); MatchesSet matches; diff --git a/modules/videoio/src/cap.cpp b/modules/videoio/src/cap.cpp index c1623f1ccc..79d53f97e6 100644 --- a/modules/videoio/src/cap.cpp +++ b/modules/videoio/src/cap.cpp @@ -166,10 +166,12 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index) #ifdef HAVE_GSTREAMER if (!capture) - capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, 0); + capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, + reinterpret_cast(index)); if (!capture) - capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L, 0); + capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L, + reinterpret_cast(index)); #endif if (pref) break; // CV_CAP_VFW diff --git a/modules/videoio/src/cap_gstreamer.cpp b/modules/videoio/src/cap_gstreamer.cpp index 4740126c0f..73537bb194 100644 --- a/modules/videoio/src/cap_gstreamer.cpp +++ b/modules/videoio/src/cap_gstreamer.cpp @@ -75,10 +75,13 @@ #if GST_VERSION_MAJOR == 0 #define COLOR_ELEM "ffmpegcolorspace" +#define COLOR_ELEM_NAME "ffmpegcsp" #elif FULL_GST_VERSION < VERSION_NUM(1,5,0) #define COLOR_ELEM "videoconvert" +#define COLOR_ELEM_NAME COLOR_ELEM #else #define COLOR_ELEM "autovideoconvert" +#define COLOR_ELEM_NAME COLOR_ELEM #endif void toFraction(double decimal, double &numerator, double &denominator); @@ -142,6 +145,7 @@ protected: gpointer data); GstElement* pipeline; GstElement* uridecodebin; + GstElement* v4l2src; GstElement* color; GstElement* sink; #if GST_VERSION_MAJOR > 0 @@ -164,6 +168,7 @@ void CvCapture_GStreamer::init() { pipeline = NULL; uridecodebin = NULL; + v4l2src = NULL; color = NULL; sink = NULL; #if GST_VERSION_MAJOR > 0 @@ -368,9 +373,7 @@ void CvCapture_GStreamer::startPipeline() if (status == GST_STATE_CHANGE_ASYNC) { // wait for status update - GstState st1; - GstState st2; - status = gst_element_get_state(pipeline, &st1, &st2, GST_CLOCK_TIME_NONE); + status = gst_element_get_state(pipeline, NULL, NULL, GST_CLOCK_TIME_NONE); } if (status == GST_STATE_CHANGE_FAILURE) { @@ -619,7 +622,9 @@ bool CvCapture_GStreamer::open( int type, const char* filename ) stream = true; manualpipeline = true; } - } else { + } + else + { stream = true; uri = g_strdup(filename); } @@ -640,68 +645,86 @@ bool CvCapture_GStreamer::open( int type, const char* filename ) uridecodebin = gst_element_make_from_uri(GST_URI_SRC, uri, "src", NULL); #endif element_from_uri = true; - }else{ + } + else + { uridecodebin = gst_element_factory_make("uridecodebin", NULL); g_object_set(G_OBJECT(uridecodebin), "uri", uri, NULL); } g_free(protocol); - if(!uridecodebin) { + if(!uridecodebin) + { //fprintf(stderr, "GStreamer: Error opening bin: %s\n", err->message); close(); return false; } } - if(manualpipeline) + if (manualpipeline) { - GstIterator *it = NULL; -#if GST_VERSION_MAJOR == 0 - it = gst_bin_iterate_sinks(GST_BIN(uridecodebin)); - if(gst_iterator_next(it, (gpointer *)&sink) != GST_ITERATOR_OK) { - CV_ERROR(CV_StsError, "GStreamer: cannot find appsink in manual pipeline\n"); - return false; - } -#else - it = gst_bin_iterate_sinks (GST_BIN(uridecodebin)); + GstIterator *it = gst_bin_iterate_elements(GST_BIN(uridecodebin)); - gboolean done = FALSE; GstElement *element = NULL; + gboolean done = false; gchar* name = NULL; +#if GST_VERSION_MAJOR > 0 GValue value = G_VALUE_INIT; +#endif - while (!done) { - switch (gst_iterator_next (it, &value)) { + while (!done) + { +#if GST_VERSION_MAJOR > 0 + switch (gst_iterator_next (it, &value)) + { case GST_ITERATOR_OK: - element = GST_ELEMENT (g_value_get_object (&value)); - name = gst_element_get_name(element); - if (name){ - if(strstr(name, "opencvsink") != NULL || strstr(name, "appsink") != NULL) { - sink = GST_ELEMENT ( gst_object_ref (element) ); - done = TRUE; - } - g_free(name); - } - g_value_unset (&value); + element = GST_ELEMENT (g_value_get_object (&value)); +#else + switch (gst_iterator_next (it, (gpointer *)&element)) + { + case GST_ITERATOR_OK: +#endif + name = gst_element_get_name(element); + if (name) + { + if (strstr(name, "opencvsink") != NULL || strstr(name, "appsink") != NULL) + { + sink = GST_ELEMENT ( gst_object_ref (element) ); + } + else if (strstr(name, COLOR_ELEM_NAME) != NULL) + { + color = GST_ELEMENT ( gst_object_ref (element) ); + } + else if (strstr(name, "v4l") != NULL) + { + v4l2src = GST_ELEMENT ( gst_object_ref (element) ); + } + g_free(name); - break; + done = sink && color && v4l2src; + } +#if GST_VERSION_MAJOR > 0 + g_value_unset (&value); +#endif + + break; case GST_ITERATOR_RESYNC: - gst_iterator_resync (it); - break; + gst_iterator_resync (it); + break; case GST_ITERATOR_ERROR: case GST_ITERATOR_DONE: - done = TRUE; - break; - } + done = TRUE; + break; + } } gst_iterator_free (it); - - if (!sink){ + if (!sink) + { CV_ERROR(CV_StsError, "GStreamer: cannot find appsink in manual pipeline\n"); return false; } -#endif + pipeline = uridecodebin; } else @@ -714,18 +737,23 @@ bool CvCapture_GStreamer::open( int type, const char* filename ) gst_bin_add_many(GST_BIN(pipeline), uridecodebin, color, sink, NULL); - if(element_from_uri) { - if(!gst_element_link(uridecodebin, color)) { + if(element_from_uri) + { + if(!gst_element_link(uridecodebin, color)) + { CV_ERROR(CV_StsError, "GStreamer: cannot link color -> sink\n"); gst_object_unref(pipeline); pipeline = NULL; return false; } - }else{ + } + else + { g_signal_connect(uridecodebin, "pad-added", G_CALLBACK(newPad), color); } - if(!gst_element_link(color, sink)) { + if(!gst_element_link(color, sink)) + { CV_ERROR(CV_StsError, "GStreamer: cannot link color -> sink\n"); gst_object_unref(pipeline); pipeline = NULL; @@ -753,16 +781,13 @@ bool CvCapture_GStreamer::open( int type, const char* filename ) gst_app_sink_set_caps(GST_APP_SINK(sink), caps); gst_caps_unref(caps); - // For video files only: set pipeline to PAUSED state to get its duration - if (file) { - status = gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PAUSED); + status = gst_element_set_state(GST_ELEMENT(pipeline), + file ? GST_STATE_PAUSED : GST_STATE_PLAYING); if (status == GST_STATE_CHANGE_ASYNC) { // wait for status update - GstState st1; - GstState st2; - status = gst_element_get_state(pipeline, &st1, &st2, GST_CLOCK_TIME_NONE); + status = gst_element_get_state(pipeline, NULL, NULL, GST_CLOCK_TIME_NONE); } if (status == GST_STATE_CHANGE_FAILURE) { @@ -813,14 +838,9 @@ bool CvCapture_GStreamer::open( int type, const char* filename ) fps = (double)num/(double)denom; - // GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "pipeline"); - } - else - { - duration = -1; - width = -1; - height = -1; - fps = -1; + // GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "pipeline") + + stopPipeline(); } __END__; @@ -851,7 +871,7 @@ double CvCapture_GStreamer::getProperty( int propId ) const if(!pipeline) { CV_WARN("GStreamer: no pipeline"); - return false; + return 0; } switch(propId) { @@ -860,7 +880,7 @@ double CvCapture_GStreamer::getProperty( int propId ) const status = gst_element_query_position(sink, FORMAT, &value); if(!status) { CV_WARN("GStreamer: unable to query position of stream"); - return false; + return 0; } return value * 1e-6; // nano seconds to milli seconds case CV_CAP_PROP_POS_FRAMES: @@ -868,7 +888,7 @@ double CvCapture_GStreamer::getProperty( int propId ) const status = gst_element_query_position(sink, FORMAT, &value); if(!status) { CV_WARN("GStreamer: unable to query position of stream"); - return false; + return 0; } return value; case CV_CAP_PROP_POS_AVI_RATIO: @@ -876,7 +896,7 @@ double CvCapture_GStreamer::getProperty( int propId ) const status = gst_element_query_position(sink, FORMAT, &value); if(!status) { CV_WARN("GStreamer: unable to query position of stream"); - return false; + return 0; } return ((double) value) / GST_FORMAT_PERCENT_MAX; case CV_CAP_PROP_FRAME_WIDTH: @@ -895,6 +915,21 @@ double CvCapture_GStreamer::getProperty( int propId ) const case CV_CAP_PROP_CONTRAST: case CV_CAP_PROP_SATURATION: case CV_CAP_PROP_HUE: + if (v4l2src) + { + const gchar * propName = + propId == CV_CAP_PROP_BRIGHTNESS ? "brightness" : + propId == CV_CAP_PROP_CONTRAST ? "contrast" : + propId == CV_CAP_PROP_SATURATION ? "saturation" : + propId == CV_CAP_PROP_HUE ? "hue" : NULL; + + if (propName) + { + gint32 value32 = 0; + g_object_get(G_OBJECT(v4l2src), propName, &value32, NULL); + return value32; + } + } case CV_CAP_PROP_GAIN: case CV_CAP_PROP_CONVERT_RGB: break; @@ -911,7 +946,7 @@ double CvCapture_GStreamer::getProperty( int propId ) const #undef FORMAT - return false; + return 0; } /*! @@ -990,6 +1025,21 @@ bool CvCapture_GStreamer::setProperty( int propId, double value ) case CV_CAP_PROP_CONTRAST: case CV_CAP_PROP_SATURATION: case CV_CAP_PROP_HUE: + if (v4l2src) + { + const gchar * propName = + propId == CV_CAP_PROP_BRIGHTNESS ? "brightness" : + propId == CV_CAP_PROP_CONTRAST ? "contrast" : + propId == CV_CAP_PROP_SATURATION ? "saturation" : + propId == CV_CAP_PROP_HUE ? "hue" : NULL; + + if (propName) + { + gint32 value32 = cv::saturate_cast(value); + g_object_set(G_OBJECT(v4l2src), propName, &value32, NULL); + return true; + } + } case CV_CAP_PROP_GAIN: case CV_CAP_PROP_CONVERT_RGB: break; diff --git a/modules/videoio/src/cap_images.cpp b/modules/videoio/src/cap_images.cpp index 253261adc1..00d5af47d1 100644 --- a/modules/videoio/src/cap_images.cpp +++ b/modules/videoio/src/cap_images.cpp @@ -67,10 +67,11 @@ class CvCapture_Images : public CvCapture public: CvCapture_Images() { - filename = 0; + filename = NULL; currentframe = firstframe = 0; length = 0; - frame = 0; + frame = NULL; + grabbedInOpen = false; } virtual ~CvCapture_Images() @@ -92,6 +93,7 @@ protected: unsigned length; // length of sequence IplImage* frame; + bool grabbedInOpen; }; @@ -100,7 +102,7 @@ void CvCapture_Images::close() if( filename ) { free(filename); - filename = 0; + filename = NULL; } currentframe = firstframe = 0; length = 0; @@ -113,17 +115,25 @@ bool CvCapture_Images::grabFrame() char str[_MAX_PATH]; sprintf(str, filename, firstframe + currentframe); + if (grabbedInOpen) + { + grabbedInOpen = false; + ++currentframe; + + return frame != NULL; + } + cvReleaseImage(&frame); frame = cvLoadImage(str, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if( frame ) currentframe++; - return frame != 0; + return frame != NULL; } IplImage* CvCapture_Images::retrieveFrame(int) { - return frame; + return grabbedInOpen ? NULL : frame; } double CvCapture_Images::getProperty(int id) const @@ -168,6 +178,8 @@ bool CvCapture_Images::setProperty(int id, double value) value = length - 1; } currentframe = cvRound(value); + if (currentframe != 0) + grabbedInOpen = false; // grabbed frame is not valid anymore return true; case CV_CAP_PROP_POS_AVI_RATIO: if(value > 1) { @@ -178,6 +190,8 @@ bool CvCapture_Images::setProperty(int id, double value) value = 0; } currentframe = cvRound((length - 1) * value); + if (currentframe != 0) + grabbedInOpen = false; // grabbed frame is not valid anymore return true; } CV_WARN("unknown/unhandled property\n"); @@ -280,7 +294,13 @@ bool CvCapture_Images::open(const char * _filename) } firstframe = offset; - return true; + + // grab frame to enable properties retrieval + bool grabRes = grabFrame(); + grabbedInOpen = true; + currentframe = 0; + + return grabRes; } @@ -292,7 +312,7 @@ CvCapture* cvCreateFileCapture_Images(const char * filename) return capture; delete capture; - return 0; + return NULL; } // diff --git a/modules/videoio/test/test_ffmpeg.cpp b/modules/videoio/test/test_ffmpeg.cpp index 3ccce81943..423817715a 100644 --- a/modules/videoio/test/test_ffmpeg.cpp +++ b/modules/videoio/test/test_ffmpeg.cpp @@ -431,6 +431,10 @@ TEST(Videoio_Video_parallel_writers_and_readers, accuracy) if (code == 1) std::cerr << "Couldn't delete " << *i << std::endl; } + + // delete the readers + for (std::vector::iterator i = readers.begin(), end = readers.end(); i != end; ++i) + delete *i; } #endif diff --git a/samples/gpu/CMakeLists.txt b/samples/gpu/CMakeLists.txt index 32c53ecf1f..6085cac3df 100644 --- a/samples/gpu/CMakeLists.txt +++ b/samples/gpu/CMakeLists.txt @@ -81,6 +81,10 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND) file(GLOB all_samples RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) + if(NOT WITH_OPENGL) + list(REMOVE_ITEM all_samples "opengl.cpp") + endif(NOT WITH_OPENGL) + foreach(sample_filename ${all_samples}) get_filename_component(sample ${sample_filename} NAME_WE) file(GLOB sample_srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${sample}.*) @@ -92,6 +96,9 @@ endif() if(INSTALL_C_EXAMPLES AND NOT WIN32) file(GLOB install_list *.c *.cpp *.jpg *.png *.data makefile.* build_all.sh *.dsp *.cmd ) + if(NOT WITH_OPENGL) + list(REMOVE_ITEM all_samples "opengl.cpp") + endif(NOT WITH_OPENGL) install(FILES ${install_list} DESTINATION ${OPENCV_SAMPLES_SRC_INSTALL_PATH}/gpu PERMISSIONS OWNER_READ GROUP_READ WORLD_READ COMPONENT samples) diff --git a/samples/gpu/opengl.cpp b/samples/gpu/opengl.cpp index e3e3ddc687..061cc58f34 100644 --- a/samples/gpu/opengl.cpp +++ b/samples/gpu/opengl.cpp @@ -1,13 +1,4 @@ #include -#include "cvconfig.h" - -#ifndef HAVE_OPENGL -int main() -{ - std::cerr << "Library was built without OpenGL support" << std::endl; - return -1; -} -#else #ifdef WIN32 #define WIN32_LEAN_AND_MEAN 1 @@ -124,5 +115,3 @@ int main(int argc, char* argv[]) return 0; } - -#endif