2013-07-15 35 views
0

我的工作是对树莓PI使用了OpenCV的项目。我遇到了一个看起来很简单的障碍,但我无法解决这个问题。 首先,在这里我的代码的一部分:OpenCV的错误:输入参数大小不匹配(操作既不是“数组运算阵列”)

{ 
     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的错误:输入参数大小不匹配(操作既不是“数组操作数组'(其中数组的大小和通道数相同),也不是'数组操作标量',也不是'标量操作数组')arithm_op,file /home/pi/OpenCV-2.3.1/modules/core /home/pi/OpenCV-2.3.1/modules/core/src/arithm.cpp:1253:/src/arithm.cpp,线路1253 终止抛出 'CV ::例外' 的一个实例后 什么()被称为:错误:(-209)该操作既不是'阵列操作数组'(w这里阵列具有相同的大小和相同数量的通道),也不是'数组运算标量',也不是'标量运算阵列'函数arithm_op

我真的不能理解发生了什么。 img1和img2全局声明为Mat。 这可能是一个简单的问题,但我仍然是一个新手。请帮我解决问题。 谢谢你的时间。

回答

2

在第一个代码块中,img1img2被声明并包含两个灰色有效图像(因为您的操作是imread)。请注意,这些img1img2不是全局变量,而是本地变量。如果您的全局变量名称相同,则本地变量会将其映射。

在第二块,你在else定义img2后来做img1 - img2,但你不展现给我们的img1值(在这种情况下,全局变量)。 if中的img1位于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块,只要他们的声明是可见的加载图像。

这是OK

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

正如你所说,似乎唯一的办法就是上面提到的方式,即在相同的if或else中同时读取两幅图像。 非常感谢您让我了解它是如何工作的。 –

0

else if块 - img1未定义或为空 - 为了提供更好的诊断,需要更多的代码。

另外:你为什么存储gray到磁盘只是为了读一遍?

相关问题