2016-08-07 2 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だけずれても問題ではありません。だから私はこのイメージをどこにコピーしようとしているのか気に入らないのですか?

答えて

2

私は思ったよりも簡単でした。 cv :: Mat()の引数は、幅THIGの幅であり、幅THIGの幅ではありません。トリッキー。しかし、マットタイプのチャンネル数が間違っていたのでエラーが発生しました。コードを弾丸にするために、コピーしたイメージのイメージタイプと同じイメージタイプに初期化しました。

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

私見を使用することができ、サブ画像を簡単にCV ::のRect要素を使用してアクセスされています。 – 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; 
} 
関連する問題