OpenCV错误:输入参数的大小不匹配(操作既不是'数组操作数组')

时间:2013-07-15 19:44:15

标签: c++ c linux opencv raspberry-pi

我正在开发一个在raspberry pi上使用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中,文件/home/pi/OpenCV-2.3.1/modules/core/src/arithm.cpp,第1253行 在抛出'cv :: Exception'的实例后终止调用  什么():/home/pi/OpenCV-2.3.1/modules/core/src/arithm.cpp:1253:错误:(-209)的动作既不是“数组运算阵列”(其中阵列具有相同的尺寸和相同数量的通道),也不是'数组操作标量',也不是函数中的'标量操作数组'arithm_op

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

2 个答案:

答案 0 :(得分:3)

在第一个代码块中,img1img2被声明并包含两个灰色有效图像(因为您执行imread)。请注意,这些img1img2不是全局变量,而是本地变量。如果你有全局变量具有相同的名称,那么本地变量会影响它们。

在第二个块中,您在img2中定义else,然后在img1 - img2中定义,但是您没有向我们展示img1的值(在此case,全局变量)。 img1中的ifif的本地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); ... } 为空)。

更新:这样的事情应该解决它。

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

再次更新:只要声明可见,您就可以在不同的if-else块中加载图像。

确定

// 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!
   ...
}

这是错误

{{1}}

答案 1 :(得分:0)

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

另外:为什么要将gray存储到磁盘只是为了再次读取它?