我正在一个在树莓派上使用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错误:输入参数的大小不匹配(该操作既不是“数组操作数组”(其中数组具有相同的大小和相同的 channel 数),也不是“数组操作标量”或“标量操作数组”) 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)操作既不是'array op array'(其中数组具有相同的大小和相同数量的 channel ),在函数arithm_op中也不是“array op scalar”,也不是“scalar op array”

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

最佳答案

在第一段代码中,img1img2被声明,并包含两个灰色有效图像(因为您执行imread)。请注意,这些img1img2不是全局变量,而是局部变量。如果全局变量具有相同的名称,则局部变量将其阴影化。

在第二个块中,您在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!
   ...
}

关于c++ - OpenCV错误: Sizes of input arguments do not match (The operation is neither 'array op array' ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17662518/

10-11 15:45