2013-06-11 20 views
20

Aşağıdaki kod bir istisna oluşturuyor. Niye ya?OpenCV'de Matrix sıfırlarla nasıl doldurulur?

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 

GÜNCELLEME

bu kodu izleme olsam, o yapıcı çizgi yapıcı

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

Neden

çağırır bkz:

#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; 
    } 

} 

Hata izler mi? Bu prototip, 4 argüman sağladığım sırada 5 parametreye sahip.

+2

Burada bir örnek var 'cv :: Mat depthMAP = cv :: Mat :: zeros (depthMap.rows, depthMac.cols, depthMeType());' –

cevap

9

son parametre isteğe bağlıdır ve aynı zamanda veri gösterici bir yerde uygun bir işaret gerekir çünkü:

//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; 

Ama daha bu şablon tabanlı yapıcısı ile doğrudan yapabilir:

//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)); 
26

Matris'i OpenCV'de sıfırlarla nasıl doldurulur?

bunu sadece sıfırları içerdiğini, sen kurucusuna değeri 0 bir sayıl geçebilir böylece Mat başlatılamadığı için Mat::zeros()

Mat m1 = ...; 
m1 = Mat::zeros(1, 1, CV_64F); 

kullanabilirsiniz sıfırlarla önceden varolan Mat nesneyi doldurmak için : sürüm başarısız

Mat m1 = Mat(1,1, CV_64F, 0.0); 
//      ^^^^double literal 

nedeni dördüncü argüman olarak 0 geçen biralarak aşırı maçları olmasıdırbir skaler alandan daha iyi.

+0

Teşekkürler. Ama benim örneğim ne yapar? '0' otomatik olarak Skaler’e dönüştürülmez mi? –

+0

@SuzanCioc, bazı veriler için bir işaretçi olarak 'void *' olarak yorumlanmış olabilir. – juanchopanza

+0

Sonunda 4 parametre ve 'void *' olan bir prototip göremiyorum. –

6

Sen şablonlarla programlama içine daha varsa, Sen bu şekilde yapmak da olabilir ...

template<typename _Tp> 
... some algo ... 
cv::Mat mat = cv::Mat_<_Tp>::zeros(rows, cols); 
mat.at<_Tp>(i, j) = val; 
1

Mat img;

img = Mat :: zeros (resim boyutu, CV_8UC3); Eğer bir resim IMG1 ait

img = Mat :: sıfırlar (img1.size, CV_8UC3) olmasını istiyorsanız

;

0

Var olan bazı matların sıfırları hakkında konuştuğunuzu farz ediyorum. Buna ne dersin?:)

mat * = 0;

3

Zaten veri içeren bir Mat nesnesindeki sıfır doldurmak için kullanabilir:

image1 = Scalar::all(0); 

eg için, bunu bu şekilde kullanırsanız:

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); 

düzgün çalışmaz. Ama bunu başlatılmamış Mat için kullanamazsınız. Bunun için Sıfır verilerin girilmesi seçebilir veya sıfır Mat oluşturabilir

Mat drawing = Mat::zeros(image.size(), CV_8UC3); 
1

gibi yukarıdaki cevapları belirtilen diğer seçenekler için gidebilirsiniz.

  1. setTo() sıfır verileri Dolum:

  2. zeros() sıfır verileri oluşturun:

    img = zeros(img.size(), img.type()); 
    

img bellek adresini değiştirir.

İlgili konular