Commit d86d8ed9 authored by Alexander Alekhin's avatar Alexander Alekhin

Merge 2.4 into master

PR #2968: cce2d992 8578f9c5
Fixed bug which caused crash of GPU version of feature matcher in stitcher

The bug caused crash of GPU version of feature matcher in stitcher when
we use ORB features.

PR #3236: 5947519f
Check sure that we're not already below required leaf false alarm rate before continuing to get negative samples.

PR #3190
fix blobdetector

PR #3562 (part): 82bd82e2
TBB updated to 4.3u2. Fix for aarch64 support.

PR #3604 (part): 091c7a38
OpenGL interop sample reworked not ot use cvconfig.h

PR #3792: afdf319f
Add -L for CUDA libs path to pkg-config

Add all dirs from CUDA_LIBS_PATH as -L linker options to
OPENCV_LINKER_LIBS. These will end up in opencv.pc.

PR #3893: 122b9f8e
Turn ocv_convert_to_lib_name into a function

PR #5490: ec5244a7
fixed memory leak in findHomography tests

PR #5491: 0d5b739d
delete video readers

PR #5574

PR #5202
parents 4448cbff 681df840
...@@ -5,21 +5,26 @@ if (WIN32 AND NOT ARM) ...@@ -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!") message(FATAL_ERROR "BUILD_TBB option supports Windows on ARM only!\nUse regular official TBB build instead of the BUILD_TBB option!")
endif() endif()
if (WIN32 AND ARM) set(tbb_ver "tbb43_20141204oss")
# 4.1 update 4 - The first release that supports Windows RT. Hangs on some Android devices set(tbb_url "http://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb43_20141204oss_src.tgz")
set(tbb_ver "tbb41_20130613oss") set(tbb_md5 "e903dd92d9433701f097fa7ca29a3c1f")
set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130613oss_src.tgz") set(tbb_version_file "version_string.ver")
set(tbb_md5 "108c8c1e481b0aaea61878289eb28b6a") ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4702)
set(tbb_version_file "version_string.ver") ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow)
ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4702)
else() # 4.1 update 4 - The first release that supports Windows RT. Hangs on some Android devices
# 4.1 update 2 - works fine #set(tbb_ver "tbb41_20130613oss")
set(tbb_ver "tbb41_20130116oss") #set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130613oss_src.tgz")
set(tbb_url "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_20130116oss_src.tgz") #set(tbb_md5 "108c8c1e481b0aaea61878289eb28b6a")
set(tbb_md5 "3809790e1001a1b32d59c9fee590ee85") #set(tbb_version_file "version_string.ver")
set(tbb_version_file "version_string.ver") #ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4702)
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow)
endif() # 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 # 4.1 update 3 dev - Hangs on some Android devices
#set(tbb_ver "tbb41_20130401oss") #set(tbb_ver "tbb41_20130401oss")
...@@ -97,7 +102,7 @@ if(NOT EXISTS "${tbb_tarball}") ...@@ -97,7 +102,7 @@ if(NOT EXISTS "${tbb_tarball}")
message(STATUS "Downloading ${tbb_ver}_src.tgz") message(STATUS "Downloading ${tbb_ver}_src.tgz")
file(DOWNLOAD "${tbb_url}" "${tbb_tarball}" TIMEOUT 600 STATUS __statvar) file(DOWNLOAD "${tbb_url}" "${tbb_tarball}" TIMEOUT 600 STATUS __statvar)
if(NOT __statvar EQUAL 0) 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() endif()
file(MD5 "${tbb_tarball}" tbb_local_md5) file(MD5 "${tbb_tarball}" tbb_local_md5)
if(NOT tbb_local_md5 STREQUAL tbb_md5) if(NOT tbb_local_md5 STREQUAL tbb_md5)
...@@ -153,6 +158,7 @@ if (WIN32) ...@@ -153,6 +158,7 @@ if (WIN32)
set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} /APPCONTAINER") set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} /APPCONTAINER")
else() else()
add_definitions(-D__TBB_DYNAMIC_LOAD_ENABLED=0 #required 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_BUILD=1 #required
-D__TBB_SURVIVE_THREAD_SWITCH=0 #no cilk support -D__TBB_SURVIVE_THREAD_SWITCH=0 #no cilk support
-DTBB_USE_DEBUG=0 #just to be sure -DTBB_USE_DEBUG=0 #just to be sure
......
...@@ -598,6 +598,9 @@ if(HAVE_CUDA) ...@@ -598,6 +598,9 @@ if(HAVE_CUDA)
if(HAVE_CUFFT) if(HAVE_CUFFT)
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${CUDA_cufft_LIBRARY}) set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${CUDA_cufft_LIBRARY})
endif() endif()
foreach(p ${CUDA_LIBS_PATH})
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} -L${p})
endforeach()
endif() endif()
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
# Solution folders: # Solution folders:
......
...@@ -206,7 +206,7 @@ bool CvCascadeClassifier::train( const string _cascadeDirName, ...@@ -206,7 +206,7 @@ bool CvCascadeClassifier::train( const string _cascadeDirName,
cout << endl << "===== TRAINING " << i << "-stage =====" << endl; cout << endl << "===== TRAINING " << i << "-stage =====" << endl;
cout << "<BEGIN" << endl; cout << "<BEGIN" << endl;
if ( !updateTrainingSet( tempLeafFARate ) ) if ( !updateTrainingSet( requiredLeafFARate, tempLeafFARate ) )
{ {
cout << "Train dataset for temp stage can not be filled. " cout << "Train dataset for temp stage can not be filled. "
"Branch training terminated." << endl; "Branch training terminated." << endl;
...@@ -297,17 +297,17 @@ int CvCascadeClassifier::predict( int sampleIdx ) ...@@ -297,17 +297,17 @@ int CvCascadeClassifier::predict( int sampleIdx )
return 1; return 1;
} }
bool CvCascadeClassifier::updateTrainingSet( double& acceptanceRatio) bool CvCascadeClassifier::updateTrainingSet( double minimumAcceptanceRatio, double& acceptanceRatio)
{ {
int64 posConsumed = 0, negConsumed = 0; int64 posConsumed = 0, negConsumed = 0;
imgReader.restart(); imgReader.restart();
int posCount = fillPassedSamples( 0, numPos, true, posConsumed ); int posCount = fillPassedSamples( 0, numPos, true, 0, posConsumed );
if( !posCount ) if( !posCount )
return false; return false;
cout << "POS count : consumed " << posCount << " : " << (int)posConsumed << endl; cout << "POS count : consumed " << posCount << " : " << (int)posConsumed << endl;
int proNumNeg = cvRound( ( ((double)numNeg) * ((double)posCount) ) / numPos ); // apply only a fraction of negative samples. double is required since overflow is possible int proNumNeg = cvRound( ( ((double)numNeg) * ((double)posCount) ) / numPos ); // apply only a fraction of negative samples. double is required since overflow is possible
int negCount = fillPassedSamples( posCount, proNumNeg, false, negConsumed ); int negCount = fillPassedSamples( posCount, proNumNeg, false, minimumAcceptanceRatio, negConsumed );
if ( !negCount ) if ( !negCount )
return false; return false;
...@@ -317,7 +317,7 @@ bool CvCascadeClassifier::updateTrainingSet( double& acceptanceRatio) ...@@ -317,7 +317,7 @@ bool CvCascadeClassifier::updateTrainingSet( double& acceptanceRatio)
return true; return true;
} }
int CvCascadeClassifier::fillPassedSamples( int first, int count, bool isPositive, int64& consumed ) int CvCascadeClassifier::fillPassedSamples( int first, int count, bool isPositive, double minimumAcceptanceRatio, int64& consumed )
{ {
int getcount = 0; int getcount = 0;
Mat img(cascadeParams.winSize, CV_8UC1); Mat img(cascadeParams.winSize, CV_8UC1);
...@@ -325,6 +325,9 @@ int CvCascadeClassifier::fillPassedSamples( int first, int count, bool isPositiv ...@@ -325,6 +325,9 @@ int CvCascadeClassifier::fillPassedSamples( int first, int count, bool isPositiv
{ {
for( ; ; ) for( ; ; )
{ {
if( consumed != 0 && ((double)getcount+1)/(double)(int64)consumed <= minimumAcceptanceRatio )
return getcount;
bool isGetImg = isPositive ? imgReader.getPos( img ) : bool isGetImg = isPositive ? imgReader.getPos( img ) :
imgReader.getNeg( img ); imgReader.getNeg( img );
if( !isGetImg ) if( !isGetImg )
......
...@@ -100,8 +100,8 @@ private: ...@@ -100,8 +100,8 @@ private:
int predict( int sampleIdx ); int predict( int sampleIdx );
void save( const std::string cascadeDirName, bool baseFormat = false ); void save( const std::string cascadeDirName, bool baseFormat = false );
bool load( const std::string cascadeDirName ); bool load( const std::string cascadeDirName );
bool updateTrainingSet( double& acceptanceRatio ); bool updateTrainingSet( double minimumAcceptanceRatio, double& acceptanceRatio );
int fillPassedSamples( int first, int count, bool isPositive, int64& consumed ); int fillPassedSamples( int first, int count, bool isPositive, double requiredAcceptanceRatio, int64& consumed );
void writeParams( cv::FileStorage &fs ) const; void writeParams( cv::FileStorage &fs ) const;
void writeStages( cv::FileStorage &fs, const cv::Mat& featureMap ) const; void writeStages( cv::FileStorage &fs, const cv::Mat& featureMap ) const;
......
...@@ -12,7 +12,7 @@ endif(WITH_VFW) ...@@ -12,7 +12,7 @@ endif(WITH_VFW)
# --- GStreamer --- # --- GStreamer ---
ocv_clear_vars(HAVE_GSTREAMER) ocv_clear_vars(HAVE_GSTREAMER)
# try to find gstreamer 1.x first # try to find gstreamer 1.x first if 0.10 was not requested
if(WITH_GSTREAMER AND NOT WITH_GSTREAMER_0_10) if(WITH_GSTREAMER AND NOT WITH_GSTREAMER_0_10)
CHECK_MODULE(gstreamer-base-1.0 HAVE_GSTREAMER_BASE) CHECK_MODULE(gstreamer-base-1.0 HAVE_GSTREAMER_BASE)
CHECK_MODULE(gstreamer-video-1.0 HAVE_GSTREAMER_VIDEO) CHECK_MODULE(gstreamer-video-1.0 HAVE_GSTREAMER_VIDEO)
...@@ -29,7 +29,7 @@ if(WITH_GSTREAMER AND NOT WITH_GSTREAMER_0_10) ...@@ -29,7 +29,7 @@ if(WITH_GSTREAMER AND NOT WITH_GSTREAMER_0_10)
set(GSTREAMER_PBUTILS_VERSION ${ALIASOF_gstreamer-pbutils-1.0_VERSION}) set(GSTREAMER_PBUTILS_VERSION ${ALIASOF_gstreamer-pbutils-1.0_VERSION})
endif() endif()
endif(WITH_GSTREAMER AND NOT WITH_GSTREAMER_0_10) endif()
# if gstreamer 1.x was not found, or we specified we wanted 0.10, try to find it # if gstreamer 1.x was not found, or we specified we wanted 0.10, try to find it
if(WITH_GSTREAMER AND NOT HAVE_GSTREAMER OR WITH_GSTREAMER_0_10) if(WITH_GSTREAMER AND NOT HAVE_GSTREAMER OR WITH_GSTREAMER_0_10)
......
...@@ -503,17 +503,15 @@ endmacro() ...@@ -503,17 +503,15 @@ endmacro()
# convert list of paths to libraries names without lib prefix # convert list of paths to libraries names without lib prefix
macro(ocv_convert_to_lib_name var) function(ocv_convert_to_lib_name var)
set(__tmp "") set(tmp "")
foreach(path ${ARGN}) foreach(path ${ARGN})
get_filename_component(__tmp_name "${path}" NAME_WE) get_filename_component(tmp_name "${path}" NAME_WE)
string(REGEX REPLACE "^lib" "" __tmp_name ${__tmp_name}) string(REGEX REPLACE "^lib" "" tmp_name "${tmp_name}")
list(APPEND __tmp "${__tmp_name}") list(APPEND tmp "${tmp_name}")
endforeach() endforeach()
set(${var} ${__tmp}) set(${var} ${tmp} PARENT_SCOPE)
unset(__tmp) endfunction()
unset(__tmp_name)
endmacro()
# add install command # add install command
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
// //
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
// Copyright (C) 2009, Willow Garage Inc., all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
// Copyright (C) 2015, Itseez Inc., all rights reserved.
// Third party copyrights are property of their respective owners. // Third party copyrights are property of their respective owners.
// //
// Redistribution and use in source and binary forms, with or without modification, // Redistribution and use in source and binary forms, with or without modification,
...@@ -564,6 +565,9 @@ void CV_HomographyTest::run(int) ...@@ -564,6 +565,9 @@ void CV_HomographyTest::run(int)
default: continue; default: continue;
} }
} }
delete[]src_data;
src_data = NULL;
} }
} }
......
...@@ -311,6 +311,10 @@ void SimpleBlobDetectorImpl::detect(InputArray image, std::vector<cv::KeyPoint>& ...@@ -311,6 +311,10 @@ void SimpleBlobDetectorImpl::detect(InputArray image, std::vector<cv::KeyPoint>&
else else
grayscaleImage = image.getMat(); grayscaleImage = image.getMat();
if (grayscaleImage.type() != CV_8UC1) {
CV_Error(Error::StsUnsupportedFormat, "Blob detector only supports 8-bit images!");
}
std::vector < std::vector<Center> > centers; std::vector < std::vector<Center> > centers;
for (double thresh = params.minThreshold; thresh < params.maxThreshold; thresh += params.thresholdStep) for (double thresh = params.minThreshold; thresh < params.maxThreshold; thresh += params.thresholdStep)
{ {
......
...@@ -220,7 +220,11 @@ void GpuMatcher::match(const ImageFeatures &features1, const ImageFeatures &feat ...@@ -220,7 +220,11 @@ void GpuMatcher::match(const ImageFeatures &features1, const ImageFeatures &feat
descriptors1_.upload(features1.descriptors); descriptors1_.upload(features1.descriptors);
descriptors2_.upload(features2.descriptors); descriptors2_.upload(features2.descriptors);
Ptr<cuda::DescriptorMatcher> 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<cuda::DescriptorMatcher> matcher = cuda::DescriptorMatcher::createBFMatcher(NORM_L1);
MatchesSet matches; MatchesSet matches;
......
...@@ -166,10 +166,12 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index) ...@@ -166,10 +166,12 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index)
#ifdef HAVE_GSTREAMER #ifdef HAVE_GSTREAMER
if (!capture) if (!capture)
capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, 0); capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2,
reinterpret_cast<char *>(index));
if (!capture) if (!capture)
capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L, 0); capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L,
reinterpret_cast<char *>(index));
#endif #endif
if (pref) break; // CV_CAP_VFW if (pref) break; // CV_CAP_VFW
......
This diff is collapsed.
...@@ -67,10 +67,11 @@ class CvCapture_Images : public CvCapture ...@@ -67,10 +67,11 @@ class CvCapture_Images : public CvCapture
public: public:
CvCapture_Images() CvCapture_Images()
{ {
filename = 0; filename = NULL;
currentframe = firstframe = 0; currentframe = firstframe = 0;
length = 0; length = 0;
frame = 0; frame = NULL;
grabbedInOpen = false;
} }
virtual ~CvCapture_Images() virtual ~CvCapture_Images()
...@@ -92,6 +93,7 @@ protected: ...@@ -92,6 +93,7 @@ protected:
unsigned length; // length of sequence unsigned length; // length of sequence
IplImage* frame; IplImage* frame;
bool grabbedInOpen;
}; };
...@@ -100,7 +102,7 @@ void CvCapture_Images::close() ...@@ -100,7 +102,7 @@ void CvCapture_Images::close()
if( filename ) if( filename )
{ {
free(filename); free(filename);
filename = 0; filename = NULL;
} }
currentframe = firstframe = 0; currentframe = firstframe = 0;
length = 0; length = 0;
...@@ -113,17 +115,25 @@ bool CvCapture_Images::grabFrame() ...@@ -113,17 +115,25 @@ bool CvCapture_Images::grabFrame()
char str[_MAX_PATH]; char str[_MAX_PATH];
sprintf(str, filename, firstframe + currentframe); sprintf(str, filename, firstframe + currentframe);
if (grabbedInOpen)
{
grabbedInOpen = false;
++currentframe;
return frame != NULL;
}
cvReleaseImage(&frame); cvReleaseImage(&frame);
frame = cvLoadImage(str, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); frame = cvLoadImage(str, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if( frame ) if( frame )
currentframe++; currentframe++;
return frame != 0; return frame != NULL;
} }
IplImage* CvCapture_Images::retrieveFrame(int) IplImage* CvCapture_Images::retrieveFrame(int)
{ {
return frame; return grabbedInOpen ? NULL : frame;
} }
double CvCapture_Images::getProperty(int id) const double CvCapture_Images::getProperty(int id) const
...@@ -168,6 +178,8 @@ bool CvCapture_Images::setProperty(int id, double value) ...@@ -168,6 +178,8 @@ bool CvCapture_Images::setProperty(int id, double value)
value = length - 1; value = length - 1;
} }
currentframe = cvRound(value); currentframe = cvRound(value);
if (currentframe != 0)
grabbedInOpen = false; // grabbed frame is not valid anymore
return true; return true;
case CV_CAP_PROP_POS_AVI_RATIO: case CV_CAP_PROP_POS_AVI_RATIO:
if(value > 1) { if(value > 1) {
...@@ -178,6 +190,8 @@ bool CvCapture_Images::setProperty(int id, double value) ...@@ -178,6 +190,8 @@ bool CvCapture_Images::setProperty(int id, double value)
value = 0; value = 0;
} }
currentframe = cvRound((length - 1) * value); currentframe = cvRound((length - 1) * value);
if (currentframe != 0)
grabbedInOpen = false; // grabbed frame is not valid anymore
return true; return true;
} }
CV_WARN("unknown/unhandled property\n"); CV_WARN("unknown/unhandled property\n");
...@@ -280,7 +294,13 @@ bool CvCapture_Images::open(const char * _filename) ...@@ -280,7 +294,13 @@ bool CvCapture_Images::open(const char * _filename)
} }
firstframe = offset; 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) ...@@ -292,7 +312,7 @@ CvCapture* cvCreateFileCapture_Images(const char * filename)
return capture; return capture;
delete capture; delete capture;
return 0; return NULL;
} }
// //
......
...@@ -431,6 +431,10 @@ TEST(Videoio_Video_parallel_writers_and_readers, accuracy) ...@@ -431,6 +431,10 @@ TEST(Videoio_Video_parallel_writers_and_readers, accuracy)
if (code == 1) if (code == 1)
std::cerr << "Couldn't delete " << *i << std::endl; std::cerr << "Couldn't delete " << *i << std::endl;
} }
// delete the readers
for (std::vector<VideoCapture *>::iterator i = readers.begin(), end = readers.end(); i != end; ++i)
delete *i;
} }
#endif #endif
...@@ -81,6 +81,10 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND) ...@@ -81,6 +81,10 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND)
file(GLOB all_samples RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) 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}) foreach(sample_filename ${all_samples})
get_filename_component(sample ${sample_filename} NAME_WE) get_filename_component(sample ${sample_filename} NAME_WE)
file(GLOB sample_srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${sample}.*) file(GLOB sample_srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${sample}.*)
...@@ -92,6 +96,9 @@ endif() ...@@ -92,6 +96,9 @@ endif()
if(INSTALL_C_EXAMPLES AND NOT WIN32) if(INSTALL_C_EXAMPLES AND NOT WIN32)
file(GLOB install_list *.c *.cpp *.jpg *.png *.data makefile.* build_all.sh *.dsp *.cmd ) 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} install(FILES ${install_list}
DESTINATION ${OPENCV_SAMPLES_SRC_INSTALL_PATH}/gpu DESTINATION ${OPENCV_SAMPLES_SRC_INSTALL_PATH}/gpu
PERMISSIONS OWNER_READ GROUP_READ WORLD_READ COMPONENT samples) PERMISSIONS OWNER_READ GROUP_READ WORLD_READ COMPONENT samples)
......
#include <iostream> #include <iostream>
#include "cvconfig.h"
#ifndef HAVE_OPENGL
int main()
{
std::cerr << "Library was built without OpenGL support" << std::endl;
return -1;
}
#else
#ifdef WIN32 #ifdef WIN32
#define WIN32_LEAN_AND_MEAN 1 #define WIN32_LEAN_AND_MEAN 1
...@@ -124,5 +115,3 @@ int main(int argc, char* argv[]) ...@@ -124,5 +115,3 @@ int main(int argc, char* argv[])
return 0; return 0;
} }
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment