簡體   English   中英

OpenCV錯誤:斷言在cv :: Mat行522中失敗

[英]OpenCV Error: Assertion failed in cv::Mat line 522

我正在嘗試編寫一個返回圖像較小部分的函數。 我正在使用函數Rect()進行剪切。 調試時沒有錯誤,但是當我嘗試執行該功能時,出現以下錯誤:

OpenCV錯誤:斷言失敗(0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows)在cv :: Mat :: Mat中,文件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;
    }
}

}

您的代碼是錯誤的。 讓我給你舉個例子:

假設您的圖片尺寸為640x480

現在讓我們使用與您使用的相同參數來計算函數的width變量

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

現在讓我們開始循環,第一次w=0 ,你會得到類似

Rect(0, 0, 319, 239)

然后對於下一次寬度迭代,您將得到w+=width ,即w=319 ,類似

Rect(319, 0, 319, 239)

第二次迭代將再次具有w+=width ,即w=638 ,您可以清楚地看到638小於我圖像的行數(640),因此它將嘗試執行

Rect(638, 0, 319, 239)

這將跳過提到的斷言,因為

roi.x + roi.width <= m.cols

將被翻譯成

638 + 319 <= 640

這是錯誤的。

您必須更改其循環方式,在最佳情況下,它也會起作用,您將丟失n列/行,即n個分割數。 (您可以嘗試設置一個

input_image.rows - width_fraction

在for循環檢查中,如果您不關心刪除的列。

進一步的建議,學習如何使用調試器! 它應該跳到斷言上,除非您在發布模式下運行它,否則,代碼應該總是失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM