Dea*_*der 5 c c++ linux opencv 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++;
Run Code Online (Sandbox Code Playgroud)
此代码没有问题。但是,如果我编辑代码以进行如下稍作修改:
{
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++;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
OpenCV错误:输入参数的大小不匹配(该操作既不是“数组操作数组”(其中数组具有相同的大小和相同的通道数),也不是“数组操作标量”或“标量操作数组”) arithm_op,文件/home/pi/OpenCV-2.3.1/modules/core/src/arithm.cpp,第1253行在抛出'cv :: Exception'what()实例之后终止调用what():/ home / pi / OpenCV- 2.3.1 / modules / core / src / arithm.cpp:1253:错误:(-209)操作既不是'array op array'(其中数组具有相同的大小和相同的通道数),也不是'array op标量”,也没有函数arithm_op中的“标量运算数组”
我真的无法理解发生了什么。img1和img2全局声明为Mat。这可能是一个简单的问题,但我仍然是新手。请帮我解决问题。感谢您的时间。
在第一个代码块中,img1和img2被声明并包含两个灰色有效图像(因为你这样做了imread)。请注意,这些img1和img2不是全局变量,而是局部变量。如果您有同名的全局变量,则本地变量会隐藏它们。
在第二个块中,您img2在elsedo 中定义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);
...
}
Run Code Online (Sandbox Code Playgroud)
再次更新:只要它们的声明可见,您就可以在不同的 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
...
}
Run Code Online (Sandbox Code Playgroud)
这是错误的:
// 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!
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21863 次 |
| 最近记录: |