29

以下のコードでは例外が発生します。なんで?

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

using namespace cv;
using namespace std;

void main() {

    try {
        Mat m1 = Mat(1,1, CV_64F, 0);
        m1.at<double>(0,0) = 0;
    }
    catch(cv::Exception &e) {
        cerr << e.what() << endl;
    }

}

エラーは次のとおりです。

OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] && (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) && ((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3
) - 1))*4) & 15) == elemSize1()) in unknown function, file %OPENCV_DIR%\build\include\opencv2\core\mat.hpp, line 537

アップデート

このコードをトレースすると、コンストラクタ行がコンストラクタを呼び出していることがわかります

inline Mat::Mat(int _rows, int _cols, int _type, void* _data, size_t _step)

なんで?このプロトタイプには 5 つのパラメーターがありますが、私は 4 つの引数を提供しています。

4

8 に答える 8

11

最後のパラメーターはオプションであり、データ ポインターも適切な場所を指す必要があるためです。

//inline Mat::Mat(int _rows, int _cols, int _type, void* _data, size_t _step)
double mydata[1];
Mat m1 = Mat(1,1, CV_64F, mydata); 
m1.at<double>(0,0) = 0;

ただし、このテンプレートベースのコンストラクターを使用して直接実行することをお勧めします。

//inline Mat::Mat(int _rows, int _cols, int _type, const Scalar& _s)
Mat m1 = Mat(1,1, CV_64F, cvScalar(0.));

//or even
Mat m1 = Mat(1,1, CV_64F, double(0));
于 2013-06-11T11:19:37.440 に答える
6

テンプレートを使用したプログラミングに興味がある場合は、この方法で行うこともできます...

template<typename _Tp>
... some algo ...
cv::Mat mat = cv::Mat_<_Tp>::zeros(rows, cols);
mat.at<_Tp>(i, j) = val;
于 2013-06-11T11:29:52.020 に答える
3

これを使用して、既にデータを含む Mat オブジェクトにゼロを埋めることができます。

image1 = Scalar::all(0);

たとえば、次のように使用する場合:

Mat image,image1;
image = imread("IMG_20160107_185956.jpg", CV_LOAD_IMAGE_COLOR);   // Read the file

if(! image.data )                              // Check for invalid input
{
    cout <<  "Could not open or find the image" << std::endl ;
    return -1;
}
cvtColor(image,image1,CV_BGR2GRAY);
image1 = Scalar::all(0);

それはうまくいきます。ただし、これを初期化されていない Mat に使用することはできません。そのためには、上記の回答に記載されている他のオプションを使用できます。

Mat drawing = Mat::zeros( image.size(), CV_8UC3 );
于 2016-02-10T10:38:23.980 に答える
0

既存のマットのゼロを埋めることについて話していると思いますか? これはどう?:)

マット *= 0;

于 2016-02-03T13:01:33.703 に答える