Ask Your Question
1

cv::dnn::blobFromImage() works in python but fails in c++

asked 2020-12-04 09:21:20 -0600

hammockman gravatar image

updated 2020-12-04 09:27:18 -0600

I am using opencv dnn.Net with the same network and with the same image in python and C++. While in python everything is ok, in C++ I get an access violation error from an opencv.dll.

Here is my code in python:

net = cv2.dnn.readNet(model, config, "Caffe")
    input_img = cv2.imread(image_path)
    blob = cv2.dnn.blobFromImage(input_img, 1.0, (40, 40), 0, False, False, cv2.CV_32F )
    net.setInput(blob)
    result = net.forward()

In this case no errors and I get the expected output.

Now the code in c++:

net = cv::dnn::readNet(model, config, "Caffe");
    cv::Mat blob;
    blob = cv::dnn::blobFromImage(input_image, 1.0, cv::Size(40,40), cv::Scalar(0,0,0), false, false, CV_32F);
    net.setInput(blob);
    net.forward();

In this case I get access violation as I run net.forward().

Both images are the same, and the are alreay 40x40, 3 channels. model and config are the same paths in python and c++ so the same caffe`model is being used.

Here is the error transcript in case this can be a hint:

Exception thrown at 0x00007FFD2C1B12DE (vcruntime140.dll) in my_exe.exe: 0xC0000005: Access violation reading location 0x000001F972DB9000.

Why is the code failing in C++? How can I fix it?

edit retag flag offensive close merge delete

Comments

opencv version ? os ? did you build the python bindings ?

can you put your model somewhere, so ppl can try to reproduce the problem ?

berak gravatar imageberak ( 2020-12-04 13:00:21 -0600 )edit
1

The OpenCV used in C++ is the default one coming with OpenVino, version 4.3, the OpenCV used in python is version 4.4. I am running my code on Windows10. The model can be found at this link (I am using the deploy version): https://github.com/ishay2b/VanillaCNN/tree/master/ZOO

hammockman gravatar imagehammockman ( 2020-12-07 02:12:56 -0600 )edit

1 answer

Sort by ยป oldest newest most voted
1

answered 2020-12-07 08:58:34 -0600

hammockman gravatar image

I was missing the following, which apparently is required to run the net in C++:

net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);

(The above for CPU inference).

edit flag offensive delete link more

Comments

it would be really interesting to see, if the bug (related to your model and the ie backend, which seems to be choosen automatically) is still there in later opencv versions

berak gravatar imageberak ( 2020-12-07 12:28:02 -0600 )edit

Question Tools

1 follower

Stats

Asked: 2020-12-04 09:21:20 -0600

Seen: 2,992 times

Last updated: Dec 07 '20