Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenCV 245 first building errors

Tags:

opencv

I downloaded the sources of opencv-2.4.5 and I followed the tutorial (on the opencv site for windows) about the installing my own libraries everything. Ok. I created the opencv.sln file with cmake then I opened it with visual studio 2010 professional and I click the build solution but just 9 succeeded. Most of the 200 failed and most of the errors about tbbd.lib not found and opencv_core245d.lib not found with LNK1104 error. I'm trying to solve it for how many days. I've tried to show the ways of files... Anyone can help please? This is about my dissertation. (Build with No Common Language Support)

like image 234
Orkun Kasapoglu Avatar asked Apr 24 '13 19:04

Orkun Kasapoglu


2 Answers

Collapse

I spent a good 15 hours or so to get the homework finished using OpenCV. 14.5 of those hours were spent just getting it setup properly. I ran through about 7 tutorial videos, several set up guides, and read hundreds of posts containing resolutions to the same erros I was getting.So I understand that simply installing OpenCV is not a trivial task and there are several steps to do this. So here is a straightforward tutorial for setting it up if you want to use openCV.

It is important to understand how things work as far as linking goes. There are three types of files, your headers that you include, the .dlls that contain the functions, and the libraries that contain instructions for how to call the functions in the .dlls. So here, rather than add just the .dlls as dependencies in the input linker, we are going to add the lib files. We will then create a System Environment variable that will tell the machine where to look for the .dll files when their corresponding library files are referenced. We will be creating a Property Sheet so that when we create a new project, we can simply add the settings to our project by clicking "Add Existing Property Sheet" instead of adding a new one. This way, we never have to go through this again.

FOLLOW THESE STEPS EXACTLY AND MAKE SURE VISUAL STUDIO IS CLOSED BEFORE CONTINUING

NOTE: When text is given in quotes with instructions to copy said text, do not include the quotes.

  • First of all, the easy part - download OpenCV 2.4.5 from their website. http://opencv.org/ and click OpenCV for Windows. It will download OpenCV 2.4.5.exe.

Install OpenCV

  • When the download finishes, double click OpenCV-2.4.5.exe to run it.

  • When asked where to extract the files, type ino the text box: "C:\"

  • C:\opencv should have been created upon completion. Navigate there to make sure.

Setup Environment Variables

  • WINDOWS 8 USERS:

     - Right click the bottom left corner of your screen when the start icon pops up.
    
     - Click "Command Prompt (Admin)"
    
     - Type "SETX -m OPENCV_DIR C:\opencv\build" and press enter to set the opencv build directory as a System Environment Variable. Wait for the console to give you confirmation that it is set.
    
     - Right click the bottom left corner of your screen when the "Start" icon pops up. Click  System -> Advanced System Settings -> Environment Variables
    
     - In the "System Variables" list box, under the "Variable" collumn, find "Path".
    
     - Highlight the "Path" row and click edit.
    
     - Click in the "Variable Value" text box and hit the "end" key on your keyboard to scroll to the end of the line and add a semicolon.
    
     - Type the following: "C:\opencv\build\x86\vc10\bin;C:\opencv\build\x86\vc10" and click "OK". This will add the openCV bin directory to the system path.
    
  • WINDOWS 7 USERS:

    Follow the same steps. The only difference is how you get to the command prompt and the system settings. Google how to set up an environment variable on Windows 7 if needed.

Setup Visial Studio

NOTE: I highly recommend VS2012 Professional because of advanced syntax highlighting that makes life so much easier when programming C++. This version can be downloaded and installed for free from DreamSpark. Just make and account with your student ID. However, the steps for VS2010 and VS2012 are the same.

  • Open Visual Studio

    • Click "New Project" and under "C++" select "Win32 Console Application".
  • When the window opens click "Next", check "Empty Project", and click "Finish". It is very important that you start with an EMPTY PROJECT without a precompiled header.

  • Locate the "Property Manager." By default, it should be a tab that is sometimes hard to miss. Alternatively it can be accessed by clicking from the toolbar "View" -> "Property Manager".

  • Right Click "Debug | Win32" and select "Add New Project Property Sheet". Name it "OpenCVProps" and click "Add".

  • Right Click your new property sheet and select "Properties".

  • From the left column, go to "C/C++" -> "General" and in the listbox on the right, select "Additional Include Directories" and click "Edit".

  • Add the following THREE directories:

    • "$(OPENCV_DIR)\include"

    • "$(OPENCV_DIR)\include\opencv"

    • "$(OPENCV_DIR)\include\opencv2"

  • From the left column, go to "Linker" -> "General" and in the listbox on the right, select "Additional Library Directories" and click "Edit".

  • Add the following directory:

    • "$(OPENCV_DIR)\x86\vc10\lib"
  • From the left column, go to "Linker" -> "Input" and in the listbox on the right, select "Additional Dependenies" and click "Edit".

  • Add the following .lib files to the depedencies. You may do this by copying and pasting these into that edit box. I have purposely not included a bulletpoint to make it easy for you to copy paste these.

    opencv_core245d.lib opencv_imgproc245d.lib opencv_highgui245d.lib opencv_ml245d.lib opencv_video245d.lib opencv_features2d245d.lib opencv_calib3d245d.lib opencv_objdetect245d.lib opencv_contrib245d.lib opencv_legacy245d.lib opencv_flann245d.lib

NOTE: If building for release, these steps are the same. However, when copying and pasting these files, remove the 'd' from the end of each of them. The 'd' denotes that it is a release library and links to a release .dll.

  • Congrats! The difficult part is almost done! Click "OK" to close the Window.

Creating and Building a Test Project

  • Head over to our Solution Explorer. This can be focused from the toolbar via "View" -> "Solution Explorer"

  • Right click "Source Files" and select "Add" -> "New Item".

  • Select "C++ File (.cpp)" and name the file "main.cpp". Click "Add".

  • Copy and paste the following program and press "F7" on your keyboard and watch the bottom left corner of your screen to see if you get a "Build Succeeded" message. If so, only one step left before you compile and run! If not, please retrace your steps, or comment below and maybe I can help.

    #include &ltopencv\cv.h&gt
    #include &ltopencv\highgui.h&gt

    int main(int argc, char* argv) 
    {  // openCV .image object
        cv::Mat inputImage;

        //Create a Window
        cv::namedWindow("window",1);

        // Initialize our image.
        inputImage = cv::imread("Lenna.png");

        // Always check to make sure that image has data.
        if(inputImage.empty())
        {
            std::cout &lt&lt "Image Failed to Load.";
            return -1;
        }
        else
        {
            // All is well, display me.
            cv::imshow("window",inputImage);

            // Wait for user to press a key to exit.
            cvWaitKey(0);
        }

        return 0; 
    } 
  • If the build succeeded, then all that is left is to add the image to your folder. The placement is very important. I have copied the directoy that I have placed mine in. Follow the same directory pattern.

    • "C:\Users\Josh\Documents\Visual Studio 2012\Projects\ConsoleApplication3\ConsoleApplication3\Lenna.png"
  • Now hit "Ctrl + F5" To build, compile, and run to observe your image in the window!!

*IF YOU HAVE A WEBCAM*

  • Copy and paste the following code to check if OpenCV is working without being required to add an image. This is useful because if the above code doesn't work, but this code does, then you know you put the image in the wrong folder.
    #include 
    #include 

    int main(int argc, char* argv) 
    {  // openCV .image object
        cv::Mat image;

        //Create a Window
        cv::namedWindow("window",1);

        // Create the capture object.
        cv::VideoCapture device;

        // Open your webcam.
        device.open(0);

        while (1)
        {
            // Read data from your device and store it to the image frame.
            device >> image;

            // Always check to make sure that image has data.
            if(image.empty())
            {
                std::cout&lt&lt "Image Failed to Load.";
                return -1;
            }
            else
            {
                // All is well, display me.
                cv::imshow("window",image);

                // Wait for user to press a key to exit.
                cvWaitKey(33);
            }
        }

        return 0; 
    } 

Happy Coding!! Let me know if something didn't work so I can fix it!

like image 79
Josh Sanders Avatar answered Jan 04 '23 15:01

Josh Sanders


Quick Answer

I have managed to compile OpenCV with TBB support using the tutorial here.

Specs: Visual Studio 2012/ Win 7 (64 bit)/ OpenCV 2.4.5/ CUDA 5

I have downloaded the latest TBB zip and extracted it to C:/src/OpenCV/dep (as suggested in the tutorial linked above).

You have to use the following TBB settings in CMake (adapt depending on your file paths):

TBB_LIB_DIR       ::  C:/src/OpenCV/dep/tbb41_20130314oss/lib/intel64/vc11
TBB_INCLUDE_DIRS  ::  C:/src/OpenCV/dep/tbb41_20130314oss/include/
TBB_STDDEF_PATH   ::  C:/src/OpenCV/dep/tbb41_20130314oss/include/tbb/tbb_stddef.h
WITH_TBB          ::  checked
BUILD_TBB         ::  unchecked

More Information

Initially, I also wanted to install OpenCV with CUDA 5 support, but it seems that CUDA 5 is incompatible with VS2012. This is the error I got when compiling OpenCV:

Building NVCC (Device) object modules/core/CMakeFiles/cuda_compile.dir/src/cuda/Debug/cuda_compile_generated_matrix_operations.cu.obj
nvcc : fatal error : nvcc cannot find a supported cl version. Only MSVC 9.0 and MSVC 10.0 are supported

The good news is that you are using VS2010, which can be used with CUDA, as suggested here. VS2012 can be set up to create projects with CUDA, but there is currently no way (AFAIK) to compile OpenCV with CUDA support for VS2012 (read this for more info).

In conclusion, people that need CUDA support should compile and use OpenCV with VS2010.

Also, when compiling OpenCV, I got the following errors:

error C3859: virtual memory range for PCH exceeded; please recompile with a command line option of '-Zm118' or greater
fatal error C1076: compiler limit : internal heap limit reached; use /Zm to specify a higher limit

I used the instructions here to finally compile OpenCV. I created a Property Sheet which had /Zm130 as an additional option in Common Properties > C/C++ > Command Line and added it to all of the generated OpenCV projects.

For your reference, I also attach the CMake configuration and CMakeCache.txt file that I've used (CUDA is disabled as I am using VS2012):

  • CMake configuration: http://pastebin.com/8rJZGZ3T
  • CMakeCache.txt: http://pastebin.com/A0q8YgJg

Hope this helps and please comment if you need me to elaborate on any step.

like image 35
Dragos Stanciu Avatar answered Jan 04 '23 16:01

Dragos Stanciu