2017-07-19 64 views
0

我正在嘗試編寫一個返回圖像較小部分的函數。我正在使用Rect()函數進行剪切。 我調試時沒有錯誤,但是當我嘗試執行我得到以下錯誤的功能:OpenCV錯誤:在cv :: Mat線斷言失敗522

OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) in cv::Mat::Mat, file C:\opencv\opencv-master\modules\core\src\matrix.cpp, line 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

每次都打印這個'Rect(w,h,width,height)',看看有什麼問題也許'width'或'height' less 0 –

回答

1

你的代碼是錯誤的。我給大家舉一個例子:

比方說你的圖像的尺寸爲640×480

現在可以計算出你的函數的寬度變量與您使用相同的參數

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

現在讓我們開始我們的循環,首次w=0和你喜歡的東西

Rect(0, 0, 319, 239) 

然後在接下來的寬度迭代,你將有w+=width這是w=319和類似

Rect(319, 0, 319, 239) 

第二次迭代將再次是w=638w+=width,因爲你清楚地可以看到638不到我的圖像(640)的行,因此會盡量做到

Rect(638, 0, 319, 239) 

這將跳提到的斷言,由於

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

將被翻譯到

638 + 319 <= 640 

這是錯誤的。

你必須改變它的循環方式,在最好的情況下它也能工作,你會鬆開n列/行,n是分割數。 (你可以嘗試把一個極限像

input_image.rows - width_fraction 

在for循環檢查,如果你不喜歡被丟棄的列。

進一步建議,學習如何使用調試器!!應該跳在斷言中,除非你在釋放模式下運行它,否則,出現錯誤,代碼應該總是失敗。

+0

另一個錯誤是我使用了行和列以錯誤的方式(寬度是指input_image.cols),我在我的帖子中改變了它。 – Grillteller