2015-01-16 2 views
0

Я работаю над приложением, где мне нужен следующий кодовый переключатель MATLAB в opencv. Это мой код в MATLAB:Ошибка C++ и OpenCV

HSV = imread(k); 
S=size(HSV) 
x = zeros(3,S(1)*S(2)); 
k=1; 
for i = 1:S(1) 
    for j = 1:S(2) 
    x(1,k)=i; 
    x(2,k)=j; 
    x(3,k)=HSV(i,j,1); %H 
    x(4,k)=HSV(i,j,2); %S 
    k=k+1; 
    end 
end 

И это мой код в OpenCV, но я думаю, что это неправильно:

IplImage* img; 
img = cvLoadImage("---"); 

CvMat* x = cvCreateMat(4, img->width*img->height, CV_8UC3); 
int k = 1; 
for (int h = 1; h <= img->height; h++) 
{ 
    for (int w = 1; w <= img->width; w++) 
    { 
    CV_MAT_ELEM(*x, int, 1, k) = h; 
    CV_MAT_ELEM(*x, int, 2, k) = w; 
    CV_MAT_ELEM(*x, int, 3, k) = CV_IMAGE_ELEM(img, uchar, h, 3 * w); //H 
    CV_MAT_ELEM(*x, int, 4, k) = CV_IMAGE_ELEM(img, uchar, h, 3 * w + 1); //S 
    k = k + 1; 
    } 
} 

Я получаю сообщение об ошибке, как это:
Assertion не удалось: (без знака) (4) < (без знака) (к) & & (без знака) (к) < (без знака) (* х) .cols

ответ

0

Matlab имеет индексы на основе 1, а C имеет индексы с индексом 0 - все ваши циклы и 1-4 в левой части CV_MAT_ELEM должны переходить от 0 до длины-1.

+0

Спасибо за ваш ответ. Я исправил ошибку, но теперь я получаю это исключение: Исключение из первого шанса в 0x010A6ADD в openCV.exe: 0xC0000005: место записи нарушения доступа 0x01082000. Необработанное исключение в 0x010A6ADD в openCV.exe: 0xC0000005: место записи нарушения доступа 0x01082000. – Denis

+0

Зафиксировали ли вы int k = 1 значение int k = 0? С помощью отладчика или оператора печати вы можете узнать, какие значения h, w и k находятся перед нарушением доступа, сравнить их с шириной и высотой. –

+0

Да, и int's в CV_MAT_ELEMs переключается на uchar. Теперь все работает. Большое спасибо. – Denis

Смежные вопросы