2016-08-07 67 views
1

一個非常簡單的概念,我有一個640x480墊子和一個800x480屏幕,所以我試圖將原始圖像複製到黑色800x480圖像的中心,所以縱橫比保持不變,但整個屏幕都被使用。將cv :: Mat複製到另一個會創建「斷言失敗0 <= _colRange.start && ..」

我跟着this後,試圖兩種解決方案(直接複製到和感興趣的區域),並得到了同樣的錯誤:

OpenCV Error: Assertion failed (0 <= _colRange.start && _colRange.start <= _colRange.end && _colRange.end <= m.cols) in Mat, file /home/pi/opencv-3.0.0/modules/core/src/matrix.cpp, line 464 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /home/pi/opencv-3.0.0/modules/core/src/matrix.cpp:464: error: (-215) 0 <= _colRange.start && _colRange.start <= _colRange.end && _colRange.end <= m.cols in function Mat 

Aborted 

違規代碼:

cv::Mat displayimage = cv::Mat(800, 480, CV_16U, cv::Scalar(0)); 
modimage1.copyTo(displayimage.rowRange(1,480).colRange(81,720)); 

我第一次嘗試它(0,480)和(80,720)的開始/結束範圍/行,但是這個錯誤使得它聽起來好像不能從0開始,所以當然我認爲我已經1了,並且我從1開始結果。但實際上,錯誤是針對COLUMNS而不是針對ROWS的,而列關閉1的話甚至都無關緊要。那麼,我試圖將該圖像複製到哪裏,有什麼不喜歡的?

回答

2

杜,這一個比我想象的要容易。 cv :: Mat()參數是高度那麼寬度,而不是寬度,然後heigth。棘手。但是我也遇到了一個錯誤,我的墊子類型的通道數量錯誤,所以爲了使代碼更加簡潔,我只是將它初始化爲將複製到其中的圖像的相同圖像類型,以便下面的代碼正常工作:

cv::Mat displayimage = cv::Mat(480, 800, modimage1.type(), cv::Scalar(0)); 
modimage1.copyTo(displayimage.rowRange(0,480).colRange(80,720)); 
+2

恕我直言,子圖像更容易CV ::矩形元素進行訪問。 – Micka

1

可以使用cv::copyMakeBorder

#include "opencv2/imgproc.hpp" 
#include "opencv2/highgui.hpp" 
#include "iostream" 

using namespace cv; 
using namespace std; 

int main(int argc, char* argv[]) 
{ 
    Mat src = imread(argv[1]); 
    if (src.empty()) 
    { 
     cout << endl 
      << "ERROR! Unable to read the image" << endl 
      << "Press a key to terminate"; 
     cin.get(); 
     return 0; 
    } 

    imshow("Source image", src); 

    Mat dst; 

    Size dst_dims = Size(800,480); 
    int top = (dst_dims.height - src.rows)/2; 
    int bottom = ((dst_dims.height + 1) - src.rows)/2; 
    int left = (dst_dims.width - src.cols)/2; 
    int right = ((dst_dims.width + 1) - src.cols)/2; 

    copyMakeBorder(src, dst, top, bottom, left, right, BORDER_CONSTANT, Scalar(0,0,0)); 

    imshow("New image", dst); 
    waitKey(); 

    return 0; 
} 
相關問題