tonnerrian
tonnerrian

Reputation: 39

Unhandled exception Microsoft C++ exception: cv::Exception at memory location

I just started with OpenCV. I downloaded OpenCV 2.4.9, and installed MSVS 2010. My Windows is X64. I followed the following steps:

a. Under Configuration Properties, click Debugging -> Environment and copy paste: PATH=C:\opencv\build\x86\vc10\bin

b. VC++ Directories -> Include directories and add the entries: C:\opencv\build\include

c. VC++ Directories -> Library directories and add the entries: C:\opencv\build\x86\vc10\lib

d. Linker -> Input -> Additional Dependencies and add the following:

opencv_calib3d249.lib;opencv_contrib249.lib;opencv_core249.lib;opencv_features2d249.lib;opencv_flann249.lib;opencv_gpu249.lib;opencv_nonfree249.lib;opencv_highgui249.lib;opencv_imgproc249.lib;opencv_legacy249.lib;opencv_ml249.lib;opencv_objdetect249.lib;opencv_ts249.lib;opencv_video249.lib;

I ran the following code:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
int main() {
        // read an image
        cv::Mat image= cv::imread("img.jpg");
        // create image window named "My Image"
        cv::namedWindow("My Image");
         cv::waitKey(1000);
        // show the image on window
        cv::imshow("My Image", image);
        // wait key for 5000 ms
        cv::waitKey(50);
        return 1;
}

To get the error:

Unhandled exception at 0x76d2b727 in BTP1.exe: Microsoft C++ exception: cv::Exception at memory location 0x003af414

I figured this might be because of the X64 and x86 mismatch. On changing the entries in a. to PATH=C:\opencv\build\ x64 \vc10\bin and in c. to C:\opencv\build\ x64 \vc10\lib, I get the following error:

The application was unable to start correctly (0xc000007b). Click OK to close the application.

Any tips on how I can get over this issue?

Upvotes: 1

Views: 37671

Answers (4)

VoteCoffee
VoteCoffee

Reputation: 5117

To add to the other answers, this also commonly occurs if you pass a color image into a tool that requires a grayscale image (ie single channel).

You can convert it to grayscale using the following code:

cv::Mat img_gray;
cv::cvtColor(img_color, img_gray, cv::COLOR_BGR2GRAY);

You can extract and combine individual color channels using the following code:

cv::Mat img_bgr[3];
cv::split(img_color, img_bgr);
//Note: OpenCV uses BGR color order
//img_bgr[0] = blue channel
//img_bgr[1] = green channel
//img_bgr[2] = red channel
cv::Mat img_gray = img_bgr[2] - img_bgr[1];  //laser line extraction is typically red channel minus green channel

Upvotes: 0

Tathagat
Tathagat

Reputation: 11

I had a similar problem, I just had to give the path of the image file for example - D:\image.png

Upvotes: -1

tonnerrian
tonnerrian

Reputation: 39

Resolved the problem. On some tinkering, I found that the program was running in the Release mode, and not the Debug mode.

It was a problem with the Additional Dependencies. Did not add the Debug versions of the same. (XYZ249d.lib)

Upvotes: 2

Bull
Bull

Reputation: 11951

This is probably happening because the image you are trying to display is empty, perhaps because the image isn't in the right folder. To confirm this, change your code to

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <iostream>  // std::cout

int main() {
    // read an image
    cv::Mat image= cv::imread("img.jpg");

    // add the following lines
    if(image.empty())
       std::cout << "failed to open img.jpg" << std::endl;
    else
       std::cout << "img.jpg loaded OK" << std::endl;

    ...   // the rest of your code

Upvotes: 5

Related Questions