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

问题描述 投票:0回答:3

我正在开发一个在树莓派上使用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”实例后调用终止 What(): /home/pi/OpenCV-2.3.1/modules/core/src/arithm.cpp:1253: error: (-209) 该操作既不是“array op array”(其中数组具有相同的大小和相同数量的通道),也不是函数 arithm_op 中的“数组运算标量”或“标量运算数组”

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

c++ c linux opencv raspberry-pi
3个回答
7
投票

在第一个代码块中,声明了

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
投票

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

另外:为什么将

gray
存储到磁盘只是为了再次读取它?


0
投票

选择较小的图像(小于50kb)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.