OpenCV错误:cv :: Mat第522行中的断言失败

时间:2017-07-19 12:18:51

标签: c++ opencv image-processing

我正在尝试编写一个返回图像较小部分的函数。我使用函数Rect()进行切割。 调试时没有错误,但是当我尝试执行该函数时,我收到以下错误:

  

OpenCV错误:断言失败(0< = roi.x&& 0< = roi.width&& roi.x + roi.width< = m.cols&& 0< cv :: Mat :: Mat中的; = roi.y&& 0< = roi.height&& roi.y + roi.height< = m.rows),文件C:\ opencv \ opencv -master \ modules \ core \ src \ matrix.cpp,第522行

这是我的代码:

void divideImage(Mat input_image, vector<Mat> output_images, int width_fraction, int height_fraction ) {

int width = input_image.rows / width_fraction - 1;
int height = input_image.cols / height_fraction - 1;

    for (int w = 0; w < input_image.rows; w+=width) {
        for (int h = 0; h < input_image.cols; h+=height) {
            Mat tiles = input_image(Rect(w, h, width, height));
            output_images.push_back(tiles);
        }
    }
}



int main(int argc, char** argv)
{

// Get parameters from command line
CommandLineParser parser(argc, argv, keys);
String image_path1 = parser.get<String>(0);

    if (image_path1.empty())
    {
        help();
        return -1;
    }

// Load image 
cv::Mat img_1_rgb = imread(image_path1, 1);
Mat img_1;
cvtColor(img_1_rgb, img_1, CV_BGR2GRAY);

vector<Mat> output_images(4);

divideImage(img_1, output_images, 2, 2);

似乎我的投资回报率有点不受限制。

在api55的帮助下,我提出了正确的循环:

 void divideImage(Mat input_image, vector<Mat> output_images, int width_fraction, int height_fraction ) {

 int width = (input_image.cols / width_fraction) - 1;
 int height = (input_image.rows / height_fraction) - 1;

for (int w = 0; w < input_image.cols-width_fraction*width_fraction; w+=width) {
    for (int h = 0; h < input_image.rows-height_fraction*height_fraction; h+=height) {
        Mat tiles = input_image(Rect(w, h, width, height));
        output_images.push_back(tiles);
        //cout << w << " " << h << " " << width << " " << height << " " << endl;
    }
}

}

1 个答案:

答案 0 :(得分:1)

你的代码错了。让我举个例子:

假设您的图片尺寸为640x480

现在让我们用您使用的相同参数计算函数的宽度变量

int width = 640 / 2 - 1; // 319

现在让我们开始循环,第一次w=0,你会得到像

这样的东西
Rect(0, 0, 319, 239)

然后,对于下一个宽度迭代,您将w+=width w=319,类似

Rect(319, 0, 319, 239)

第二次迭代将再次w+=widthw=638,因为你可以清楚地看到638小于我的图像行(640),因此它会尝试做

Rect(638, 0, 319, 239)

将跳过提到的断言,因为

  

roi.x + roi.width&lt; = m.cols

将被翻译为

638 + 319 <= 640

这是假的。

你必须改变它的循环方式,同样在它工作的最佳情况下,你将松散n列/行,n是分割数。 (你可以尝试设置限制,如

input_image.rows - width_fraction
如果您不关心已删除的列,请在for循环检查中

进一步的建议,学习如何使用调试器!!它应该跳转断言,除非你在发布模式下运行它,否则,出现问题,代码应该总是失败。