OpenCV 错误 : Assertion failed (j < nimages)

标签 opencv

我在论文(文凭)中使用了 OpenCV 的 MeanShiftAlgorithm。 QT4.6中的Example运行良好。只有在我们自己的 GUI 应用程序中,我们收到一个 320x3x240 RGB 流,才会给它以下错误消息:

OpenCV Error: Assertion failed (j < nimages) in histPrepareImages, file /home/luca/OpenCvSDK/opencv-src/modules/imgproc/src/histogram.cpp, line 148
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/luca/OpenCvSDK/opencv-src/modules/imgproc/src/histogram.cpp:148: error: (-215) j < nimages in function histPrepareImages

GUI 在 Ubuntu 下用 Eclipse/QT4.6 编程。这是代码:

// Mean Shift Algorithm On
minSat=65;
ch[1]={0};
if (m_meanShiftAlgoOn)
{
    if (m_firstFrame)
    {
        m_firstFrame = false;
        // Define ROI
        imageROI= m_currentFrame(       cv::Rect(m_meanShift_xPos,m_meanShift_yPos,
                                                 m_meanShift_width,m_meanShift_height));
        cv::rectangle(m_currentFrame,   cv::Rect(m_meanShift_xPos,m_meanShift_yPos,m_meanShift_width,
                                                 m_meanShift_height),cv::Scalar(0,0,255));
        // Get the Hue histogram
        ColorHistogram hc;
        cv::MatND colorhist= hc.getHueHistogram(imageROI,minSat);

        finder.setHistogram(colorhist);
        finder.setThreshold(0.2f);

        // Convert to HSV space
        cv::cvtColor(m_currentFrame, hsv, CV_BGR2HSV);

        // Split the image
        cv::split(hsv,v);

        // Eliminate pixels with low saturation
        cv::threshold(v[1],v[1],minSat,255,cv::THRESH_BINARY);
        // for debug only: shows the frame with threshold
        //m_currentFrame = v[1];

        // Get back-projection of hue histogram
        result1= finder.find(hsv,0.0f,180.0f,ch,1);
        // for debug only: shows the frame with back-projection of hue histogram
        //m_currentFrame = result1;

        cv::bitwise_and(result1,v[1],result1);
        // for debug only: shows the frame with bitwise_and of src1 and src2
        //m_currentFrame = result1;
    }
    else
    {
            // Second frame

        // Convert to HSV space
        cv::cvtColor(m_currentFrame, hsv, CV_BGR2HSV);

        // Split the frame
        cv::split(hsv,v);

        // Eliminate pixels with low saturation
        cv::threshold(v[1],v[1],minSat,255,cv::THRESH_BINARY);
        // for debug only: shows the frame with eliminated pixels with low saturation
        //m_currentFrame = v[1];

        // Get back-projection of hue histogram
        result2= finder.find(hsv,0.0f,180.0f,ch,1);     // here code crash
        // for debug only: shows the frame with back-projection of hue histogram
        //m_currentFrame = result2;

        // Eliminate low stauration pixels
        cv::bitwise_and(result2,v[1],result2);

        // Get back-projection of hue histogram
        finder.setThreshold(-1.0f);
        result2= finder.find(hsv,0.0f,180.0f,ch,1);
        cv::bitwise_and(result2,v[1],result2);

        cv::Rect rect(m_meanShift_xPos,m_meanShift_yPos,m_meanShift_width,m_meanShift_height);
        cv::rectangle(m_currentFrame, rect, cv::Scalar(0,0,255));

        cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER,10,0.01);

        cv::rectangle(m_currentFrame, rect, cv::Scalar(0,255,0));

    }
}
else
    m_firstFrame = true;

ROI 的参数是:

m_meanShift_xPos= 80
m_meanShift_yPos= 120
m_meanShift_width= 80
m_meanShift_height= 90

这里还是histogramm.cpp/LINE 1163文件中的函数(如错误信息所示)

static void histPrepareImages( const Mat* images, int nimages, const int* channels,
                               const Mat& mask, int dims, const int* histSize,
                               const float** ranges, bool uniform,
                               vector<uchar*>& ptrs, vector<int>& deltas,
                               Size& imsize, vector<double>& uniranges )
{
    int i, j, c;
    CV_Assert( channels != 0 || nimages == dims );

    imsize = images[0].size();
    int depth = images[0].depth(), esz1 = (int)images[0].elemSize1();
    bool isContinuous = true;

    ptrs.resize(dims + 1);
    deltas.resize((dims + 1)*2);

    for( i = 0; i < dims; i++ )
    {
        if(!channels)
        {
            j = i;
            c = 0;
            CV_Assert( images[j].channels() == 1 );
        }
        else
        {
            c = channels[i];
            CV_Assert( c >= 0 );
            for( j = 0; j < nimages; c -= images[j].channels(), j++ )
                if( c < images[j].channels() )
                    break;
            CV_Assert( j < nimages );               // line 148
        }

        CV_Assert( images[j].size() == imsize && images[j].depth() == depth );
        if( !images[j].isContinuous() )
            isContinuous = false;
        ptrs[i] = images[j].data + c*esz1;
        deltas[i*2] = images[j].channels();
        deltas[i*2+1] = (int)(images[j].step/esz1 - imsize.width*deltas[i*2]);
    }

    if( mask.data )
    {
        CV_Assert( mask.size() == imsize && mask.channels() == 1 );
        isContinuous = isContinuous && mask.isContinuous();
        ptrs[dims] = mask.data;
        deltas[dims*2] = 1;
        deltas[dims*2 + 1] = (int)(mask.step/mask.elemSize1());
    }

    if( isContinuous )
    {
        imsize.width *= imsize.height;
        imsize.height = 1;
    }

    if( !ranges )
    {
        CV_Assert( depth == CV_8U );

        uniranges.resize( dims*2 );
        for( i = 0; i < dims; i++ )
        {
            uniranges[i*2] = histSize[i]/256.;
            uniranges[i*2+1] = 0;
        }
    }
    else if( uniform )
    {
        uniranges.resize( dims*2 );
        for( i = 0; i < dims; i++ )
        {
            CV_Assert( ranges[i] && ranges[i][0] < ranges[i][1] );
            double low = ranges[i][0], high = ranges[i][1];
            double t = histSize[i]/(high - low);
            uniranges[i*2] = t;
            uniranges[i*2+1] = -t*low;
        }
    }
    else
    {
        for( i = 0; i < dims; i++ )
        {
            size_t j, n = histSize[i];
            for( j = 0; j < n; j++ )
                CV_Assert( ranges[i][j] < ranges[i][j+1] );
        }
    }
}

提前感谢您的任何回答...

最佳答案

对我来说,我不得不改变

img = cv2.imread('image.jpg', 0)

img = cv2.imread('image.jpg')

0 是一个 imreadModes要求 cv 以灰度模式读取图像。

关于OpenCV 错误 : Assertion failed (j < nimages),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10506823/

相关文章:

java - 使用opencv进行人脸检测不起作用

python - 使用opencv绘图时预览线

python-3.x - 由于 libGl 错误,无法运行 docker 镜像

python - 使用图像作为卷积核

c++ - OpenCV 错误 : Assertion failed (vc_. isOpened()) 复位

python - 如何使用 opencv 从皮肤图像中去除毛发?

python - 如何创建以一定角度显示一堆图像的图形?

OpenCV计算图像坐标的视差

c - OpenCV 中的加权线性最小二乘法

python cv2 错误地检测多个图像中的方形