Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

batchDistance assert error

When I use batchDistance in OpenCV4Android, I get the following assertion error:

10-16 17:33:22.770: E/cv::error()(30470): OpenCV Error: Assertion failed (_nidx.needed() == (K > 0)) in void cv::batchDistance(const cv::_InputArray&, const cv::_InputArray&, const cv::_OutputArray&, int, const cv::_OutputArray&, int, int, const cv::_InputArray&, int, bool), file X:\Dev\git\opencv-2.4\modules\core\src\stat.cpp, line 1771
10-16 17:33:22.775: E/AndroidRuntime(30470): FATAL EXCEPTION: main
10-16 17:33:22.775: E/AndroidRuntime(30470): CvException [org.opencv.core.CvException: X:\Dev\git\opencv-2.4\modules\core\src\stat.cpp:1771: error: (-215) _nidx.needed() == (K > 0) in function void cv::batchDistance(const cv::_InputArray&, const cv::_InputArray&, const cv::_OutputArray&, int, const cv::_OutputArray&, int, int, const cv::_InputArray&, int, bool)

I'm using batchDistance as follows:

    Mat distances = new Mat();
    Mat nidx = new Mat();
    assert(nidx.empty());

    Core.batchDistance(queryDescriptors, 
            mTrainDescriptors, 
            distances, 
            Core.NORM_HAMMING2,
            nidx 
            );

I've used nidx = new Mat() because I saw that in C++ the default was noArray(), which should be equal to an empty Mat. In Java, the method .needed() doesn't exist, so I don't know what's actually the problem.

Please help me fix this or help me find another way to calculate the pairwise distance of the descriptors in two Mat's.

batchDistance assert error

When I use batchDistance in OpenCV4Android, I get the following assertion error:

10-16 17:33:22.770: E/cv::error()(30470): OpenCV Error: Assertion failed (_nidx.needed() == (K > 0)) in void cv::batchDistance(const cv::_InputArray&, const cv::_InputArray&, const cv::_OutputArray&, int, const cv::_OutputArray&, int, int, const cv::_InputArray&, int, bool), file X:\Dev\git\opencv-2.4\modules\core\src\stat.cpp, line 1771
10-16 17:33:22.775: E/AndroidRuntime(30470): FATAL EXCEPTION: main
10-16 17:33:22.775: E/AndroidRuntime(30470): CvException [org.opencv.core.CvException: X:\Dev\git\opencv-2.4\modules\core\src\stat.cpp:1771: error: (-215) _nidx.needed() == (K > 0) in function void cv::batchDistance(const cv::_InputArray&, const cv::_InputArray&, const cv::_OutputArray&, int, const cv::_OutputArray&, int, int, const cv::_InputArray&, int, bool)

I'm using batchDistance as follows:

    Mat distances = new Mat();
    Mat nidx = new Mat();
    assert(nidx.empty());

    Core.batchDistance(queryDescriptors, 
            mTrainDescriptors, 
            distances, 
            Core.NORM_HAMMING2,
            nidx 
            );

I've used nidx = new Mat() because I saw that in C++ the default was noArray(), which should be equal to an empty Mat. In Java, the method .needed() doesn't exist, so I don't know what's actually the problem.problem.

Please help me fix this or help me find another way to calculate the pairwise distance of the descriptors in two Mat's.

Edit: noArray() doesn't exist under OpenCV4Android and passing in null results in a NullPointerException.

batchDistance assert error

When I use batchDistance in OpenCV4Android, I get the following assertion error:

10-16 17:33:22.770: E/cv::error()(30470): OpenCV Error: Assertion failed (_nidx.needed() == (K > 0)) in void cv::batchDistance(const cv::_InputArray&, const cv::_InputArray&, const cv::_OutputArray&, int, const cv::_OutputArray&, int, int, const cv::_InputArray&, int, bool), file X:\Dev\git\opencv-2.4\modules\core\src\stat.cpp, line 1771
10-16 17:33:22.775: E/AndroidRuntime(30470): FATAL EXCEPTION: main
10-16 17:33:22.775: E/AndroidRuntime(30470): CvException [org.opencv.core.CvException: X:\Dev\git\opencv-2.4\modules\core\src\stat.cpp:1771: error: (-215) _nidx.needed() == (K > 0) in function void cv::batchDistance(const cv::_InputArray&, const cv::_InputArray&, const cv::_OutputArray&, int, const cv::_OutputArray&, int, int, const cv::_InputArray&, int, bool)

I'm using batchDistance as follows:

    Mat distances = new Mat();
    Mat nidx = new Mat();
    assert(nidx.empty());

    Core.batchDistance(queryDescriptors, 
            mTrainDescriptors, 
            distances, 
            Core.NORM_HAMMING2,
            nidx 
            );

I've used nidx = new Mat() because I saw that in C++ the default was noArray(), which should be equal to an empty Mat. In Java, the method .needed() doesn't exist, so I don't know what's actually the problem.

Please help me fix this or help me find another way to calculate the pairwise distance of the descriptors in two Mat's.

Edit: noArray() doesn't exist under OpenCV4Android and passing in null results in a NullPointerException.

Workaround

This doesn't really solve the issue at hand, but a workaround is to call it as follows:

    Core.batchDistance(queryDescriptors, 
            mTrainDescriptors, 
            distances, 
            -1, 
            nidx, 
            Core.NORM_L1,
            1
            );

This circumvents the assertion _nidx.needed() == (K > 0) because K is set to 1. I don't really know what K represents/means though, so this does not solve the question as I would like to call batchDistance with as many default parameters as possible (= safest if you don't know the inner workings of a method yet, I think).