gpt4 book ai didi

c++ - OpenCV 错误 : Assertion Failed in MixChannels(.。)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:50:54 38 4
gpt4 key购买 nike

我正在尝试将 MATLAB .mat 文件转换为 openCV MAT,然后对这些文件应用多个掩码。我正在从 cvmatio source code 开始 build .我收到以下错误:

OpenCV Error: Assertion failed (A.size == arrays[i0]->size) in init, file /home/derek/Documents/Libraries/opencv-3.0.0-beta/modules/core/src/matrix.cpp, line 4279 terminate called after throwing an instance of 'cv::Exception' what(): /home/derek/Documents/Libraries/opencv-3.0.0-beta/modules/core/src/matrix.cpp:4279: error: (-215) A.size == arrays[i0]->size in function init

这是我写的源文件。它出现在 MixChannels 所在的行。请注意,SrcImage 是一个 3 channel 垫。 lower 和 upper 是长度等于 channel 数的数组中的阈值。

/*
* Mask.cpp
*
* Created on: Mar 16, 2015
* Author: derek
*/


#include <cv.h>
#include <highgui.h>
#include "imgcodecs.hpp"
#include "highgui.hpp"
#include "imgproc.hpp"

using namespace cv;


Mat Mask(Mat SrcImage, double lower[], double upper[]){
int height=SrcImage.rows;
int width=SrcImage.cols;
int depth=SrcImage.depth();
Mat B2d = Mat::ones(height, width,depth);

Mat out(height, width, depth);
Mat outL(height, width, depth);
Mat outU(height,width, depth);
for (int i=1; i< SrcImage.channels(); i=i+1){
int from_to[]={i,1};
mixChannels(&SrcImage, 3, &out, 1, from_to, 1 );
threshold(out, outL, lower[i], 1, THRESH_BINARY);
threshold(out, outU, upper[i], 1, THRESH_BINARY);
bitwise_and(B2d, outL, B2d);
bitwise_and(B2d, outU, B2d);

}

return B2d;
}

此外,这里是实际 CV_Assertion 错误位置的摘录。如错误中所示,它发生在“(A.size == arrays[i0]->size)”处。

void NAryMatIterator::init(const Mat** _arrays, Mat* _planes, uchar** _ptrs, int _narrays)
{
CV_Assert( _arrays && (_ptrs || _planes) );
int i, j, d1=0, i0 = -1, d = -1;

arrays = _arrays;
ptrs = _ptrs;
planes = _planes;
narrays = _narrays;
nplanes = 0;
size = 0;

if( narrays < 0 )
{
for( i = 0; _arrays[i] != 0; i++ )
;
narrays = i;
CV_Assert(narrays <= 1000);
}

iterdepth = 0;

for( i = 0; i < narrays; i++ )
{
CV_Assert(arrays[i] != 0);
const Mat& A = *arrays[i];
if( ptrs )
ptrs[i] = A.data;

if( !A.data )
continue;

if( i0 < 0 )
{
i0 = i;
d = A.dims;

// find the first dimensionality which is different from 1;
// in any of the arrays the first "d1" step do not affect the continuity
for( d1 = 0; d1 < d; d1++ )
if( A.size[d1] > 1 )
break;
}
else
CV_Assert( A.size == arrays[i0]->size );

if( !A.isContinuous() )
{
CV_Assert( A.step[d-1] == A.elemSize() );
for( j = d-1; j > d1; j-- )
if( A.step[j]*A.size[j] < A.step[j-1] )
break;
iterdepth = std::max(iterdepth, j);
}
}

if( i0 >= 0 )
{
size = arrays[i0]->size[d-1];
for( j = d-1; j > iterdepth; j-- )
{
int64 total1 = (int64)size*arrays[i0]->size[j-1];
if( total1 != (int)total1 )
break;
size = (int)total1;
}

iterdepth = j;
if( iterdepth == d1 )
iterdepth = 0;

nplanes = 1;
for( j = iterdepth-1; j >= 0; j-- )
nplanes *= arrays[i0]->size[j];
}
else
iterdepth = 0;

idx = 0;

if( !planes )
return;

for( i = 0; i < narrays; i++ )
{
CV_Assert(arrays[i] != 0);
const Mat& A = *arrays[i];

if( !A.data )
{
planes[i] = Mat();
continue;
}

planes[i] = Mat(1, (int)size, A.type(), A.data);
}
}

最佳答案

嗯,现在回答显然为时已晚,但这是您的代码失败的原因:

由于您的 SrcImage 是具有多个 channel 的单个 Mat,因此您应该这样写:

mixChannels(&SrcImage, 1, &out, 1, from_to, 1 );

(断言错误与此有关,因为 mixChannels 需要 3 个垫子,比你的垫子大 3 倍。)

还有 opencv MixChannels 从 0 开始标记 channel ,不确定 i=1 是否有意,或者只是一个错字。

干杯!

关于c++ - OpenCV 错误 : Assertion Failed in MixChannels(.。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29130261/

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