2013-07-15 2 views
0

Я работаю над проектом, который использует opencv на малине pi. Я столкнулся с барьером, который выглядит просто, но я не могу решить проблему. Прежде всего, здесь часть моего кода:Ошибка OpenCV: размеры входных аргументов не совпадают (операция не является «массивом op array»)

{ 
     gray=cvarrToMat(py); 
     ///cvShowImage("camcvWin", py); // display only gray channel 
     if(img_num%2 == 1) 
     { 
      cv::imwrite("/home/pi/test/Gray_2Image1.jpg",gray); 
     } 
     else if (img_num%2 == 0) 
     { 
      cv::imwrite("/home/pi/test/Gray_2Image2.jpg", gray); 
      cv::Mat img2 = cv::imread("/home/pi/test/Gray_2Image2.jpg", 0); 
      cv::Mat img1 = cv::imread("/home/pi/test/Gray_2Image1.jpg", 0); 
      diffImage = abs(img1-img2); 
      imshow("diffImage", diffImage); 
      cv::imwrite("/home/pi/test/Diffimage.jpg", diffImage); 

     }   
     img_num++; 

Этот код не имеет никаких проблем. массив Размеры входных аргументов не совпадают (операция не является ни»: Однако, если изменить код, чтобы сделать небольшое изменение следующим образом:

{ 
     gray=cvarrToMat(py); 
     ///cvShowImage("camcvWin", py); // display only gray channel 
     if(img_num%2 == 1) 
     { 
      cv::imwrite("/home/pi/test/Gray_2Image1.jpg",gray); 
      cv::Mat img1 = cv::imread("/home/pi/test/Gray_2Image1.jpg", 0); 
     } 
     else if (img_num%2 == 0) 
     { 
      cv::imwrite("/home/pi/test/Gray_2Image2.jpg", gray); 
      cv::Mat img2 = cv::imread("/home/pi/test/Gray_2Image2.jpg", 0); 
      diffImage = abs(img1-img2); 
      imshow("diffImage", diffImage); 
      cv::imwrite("/home/pi/test/Diffimage.jpg", diffImage); 

     }   
     img_num++; 

Я получаю следующее сообщение об ошибке:

OpenCV Ошибка op array '(где массивы имеют одинаковый размер и одинаковое количество каналов), а не' array op scalar ', а не' scalar op array ') в arithm_op, файл /home/pi/OpenCV-2.3.1/modules/core /src/arithm.cpp, строка 1253 завершение вызова после вызова экземпляра 'cv :: Exception' what(): /home/pi/OpenCV-2.3.1/modules/core/src/arithm.cpp:1253 : error: (-209) Операция не является «массивом op array» (w здесь массивы имеют одинаковый размер и одинаковое количество каналов), ни «массив op scalar», ни «scalar op array» в функции arithm_op

Я не в состоянии понять, что происходит. img1 и img2 объявляются глобально как Mat. Это может быть простая проблема, но я все еще новичок. Пожалуйста, помогите мне решить проблему. Спасибо за ваше время.

ответ

2

В первом блоке кода объявлены img1 и img2 и содержат два серых допустимых изображения (так как вы делаете imread). Обратите внимание, что эти img1 и img2 не являются глобальными переменными, а локальными. Если у вас есть глобальные переменные с одинаковыми именами, локальные теневые.

Во втором блоке, можно определить img2 в else, а затем сделать img1 - img2, но не показывают нам значение img1 (в данном случае, глобальная переменная). img1, который находится в if, является локальным для этого if и не отображается в else. Вероятно, вы определили cv::Mat img1 в глобальном масштабе, но вы не дали ему никакой ценности. Это приведет к ошибке в img1-img2, потому что они имеют разный размер (img1 будет пустым).

Обновление: Что-то вроде этого должно исправить.

// global scope 
cv::Mat img1, img2, diffImage; 

void yourFunction() 
{ 
    ... 
    img1 = cv::imread("/home/pi/test/Gray_2Image1.jpg", 0); 
    img2 = cv::imread("/home/pi/test/Gray_2Image2.jpg", 0); 
    diffImage = abs(img1-img2); 
    ... 
} 

Обновление еще раз: вы можете загружать изображения в разные блоки if-else, пока их объявление будет видимым.

Это нормально:

// global scope 
cv::Mat img1, img2, diffImage; 

void yourFunction() 
{ 
    ... 
    if(condition) 
    { 
     img1 = cv::imread("/home/pi/test/Gray_2Image1.jpg", 0); 
    } 
    else 
    { 
     img2 = cv::imread("/home/pi/test/Gray_2Image2.jpg", 0); 
    } 
    ... 
    diffImage = abs(img1-img2); // make sure img1 and img2 are loaded first 
    ... 
} 

И это неправильно:

// global scope 
cv::Mat img1, img2, diffImage; 

void yourFunction() 
{ 
    ... 
    if(condition) 
    { 
     // wrong: you are creating a local variable that shadows the global one 
     cv::Mat img1 = cv::imread("/home/pi/test/Gray_2Image1.jpg", 0); 
    } 
    ... 
    diffImage = abs(img1-img2); // img1 is the global variable and not the local one in the previous if block! 
    ... 
} 
+0

Теперь я получаю точку. Есть ли способ решить эту проблему? Как объявить img1 и img2 в двух разных условиях и использовать их без этой ошибки. Я объявил img1 и img2 как глобальную переменную, и нет локальных переменных с именами img1 и img2. –

+0

Я отредактировал свой ответ, чтобы ответить на ваш комментарий. Обратите внимание, что вы не можете объявлять переменные в одной области и использовать их в другой, где первая не отображается. Это означает, что вы не можете объявить переменную в блоке if и использовать ее в блоке else, объявление должно быть видимым из блока, в котором вы используете переменную. В моем примере я использовал глобальную область, поэтому вы можете использовать переменные в любом if или else-блоке. Однако вы должны объявить переменные с минимальным объемом, который вам нужен. В примере, если вам не нужны img1 или img2 вне вашей функции, они должны быть лучше локальными. – ChronoTrigger

+0

Как вы сказали, кажется, что единственный способ сделать это - это способ, упомянутый выше, который включает в себя одновременное считывание двух изображений в том же, если и еще. Большое спасибо за то, что вы поняли, как это работает. –

0

В блоке else if - img1 не определен или не задан - чтобы дать лучший диагноз, требуется больше кода.

Также: почему вы храните gray на диск, чтобы прочитать его снова?

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