gpt4 book ai didi

c++ - OpenCV 错误 : Sizes of input arguments do not match (The operation is neither 'array op array' )

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:21 26 4
gpt4 key购买 nike

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

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

最佳答案

在第一个代码块中,声明了 img1img2 并包含两个灰色有效图像(因为您执行了 imread)。注意这些img1img2不是全局变量,而是局部变量。如果您有同名的全局变量,则局部变量会隐藏它们。

在第二个 block 中,您在 else 中定义了 img2,然后执行 img1 - img2,但您没有向我们展示img1 的值(在本例中为全局变量)。 if 中的 img1if 的本地元素,在 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 block 中加载图像,只要它们的声明可见即可。

没问题:

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com