0

I have a problem with my project in OpeCV. I want to get picture, which is a result of subtraction two pictures, and then get marked edges with using a Canny Edge Detector, but only what I get is a exception.

Here is a print screen with exception:

enter image description here

This is my code:

#pragma once
#include <opencv2/core/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    Mat pierwszy = imread("one.jpg", IMREAD_COLOR);
    Mat drugi = imread("two.jpg", IMREAD_COLOR);
    Mat wynik;
    subtract(pierwszy, drugi , wynik);
    imwrite("../../images/wynik.jpg", wynik);
    Canny(wynik, wynik, 33, 100);
    namedWindow("Display window", WINDOW_AUTOSIZE);
    imshow("Display window", wynik);
    waitKey(0);
    return 0;
}

Mat's objects are the same size.

B.Kosmowski
  • 143
  • 9
  • Possibly related to http://stackoverflow.com/questions/7417637/imread-not-working-in-opencv – Werner Erasmus Sep 14 '15 at 18:30
  • Add a try / catch block in your code, to get more information: try { ... } catch(cv::Exception e) { // print error message } . Also, can you run your code in debug mode, to find in which line it is crashing? – Sergio Sep 14 '15 at 18:37
  • You need to compute canny on a grayscale CV_8UC1 image. wynik is probably a CV_8UC3 – Miki Sep 14 '15 at 18:55
  • Sorry I forget to add, that my exeption appears in line Canny(wynik, wynik, 33, 100); – B.Kosmowski Sep 14 '15 at 19:02
  • Take advantage of break and look at the stack trace to narrow your search. – user4581301 Sep 14 '15 at 19:04
  • @Miki You are right. I used cvtColor(wynik, wynik gray, COLOR_BGR2GRAY); and now it's working. Thank all of you :)! – B.Kosmowski Sep 14 '15 at 19:12

1 Answers1

1

To use Cany Edge Detector we need make image on gray scale, like Miki said. Now I use function cvtColor with COLOR_BGR2GRAY and my code looks like this:

#pragma once
#include <opencv2/core/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    Mat pierwszy = imread("one.jpg", IMREAD_COLOR);
    Mat drugi = imread("two.jpg", IMREAD_COLOR);
    Mat wynik;
    subtract(pierwszy, drugi , wynik);
    imwrite("../../images/wynik.jpg", wynik);
    Mat wynik_gray;
    cvtColor(wynik, wynik_gray, COLOR_BGR2GRAY);
    Canny(wynik_gray, wynik_gray, 33, 100);
    namedWindow("Display window", WINDOW_AUTOSIZE);
    imshow("Display window", wynik_gray);
    waitKey(0);
    return 0;
}
B.Kosmowski
  • 143
  • 9