我的工作是对树莓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。 这可能是一个简单的问题,但我仍然是一个新手。请帮我解决问题。 谢谢你的时间。
现在我明白了。有没有办法解决这个问题?如何在两种不同的条件下声明img1和img2,并且仍然可以在不发生此错误的情况下使用它们。我已经将img1和img2声明为全局变量,并且没有名为img1和img2的局部变量。 –
我编辑了我的答案以回答您的评论。请注意,您不能在一个范围内声明变量,并在第一个不可见的另一个范围内使用它们。可以这么说,你不能在if块中声明一个变量并在else块中使用它,声明必须在你使用该变量的块中可见。在我的例子中,我使用了全局作用域,以便您可以在任何if或else块中使用变量。但是,您应该使用所需的最小范围声明变量。在这个例子中,如果你不需要img1或img2以外的功能,它们应该更好。 – ChronoTrigger
正如你所说,似乎唯一的办法就是上面提到的方式,即在相同的if或else中同时读取两幅图像。 非常感谢您让我了解它是如何工作的。 –