2016-08-07 4 views
1

Ein ziemlich einfaches Konzept, ich habe eine 640x480 Mat und eine 800x480 Bildschirm, so versuche ich das Originalbild zu kopieren Mittelpunkt eines schwarzen 800x480 Bildes, so dass das Seitenverhältnis beibehalten wird, aber der gesamte Bildschirm verwendet wird.Kopieren von cv :: Mat zu einem anderen erstellt "Assertion fehlgeschlagen 0 <= _colRange.start && .."

folgte ich this Post und versuchte, beiden Lösungen (direkte Kopie und die Region von Interesse) und den gleichen Fehler:

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 

Der problematische Code:

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

Ich versuchte es zuerst mit Start/End Range/Zeile von (0,480) und (80,720), aber dann klang der Fehler so, als könnte er nicht bei 0 beginnen, also dachte ich natürlich, dass ich um 1 war und ich begann bei 1 mit dem selben Ergebnisse. Aber in Wirklichkeit ist der Fehler für die Spalten und nicht die Zeilen, und mit den Spalten um 1 würde nicht einmal eine Rolle spielen. Also, wie gefällt es mir nicht, wo ich dieses Bild kopieren möchte?

Antwort

2

Duh, das war einfacher als ich dachte. Die Argumente cv :: Mat() sind Höhe THEN Breite, nicht Breite dann Höhe. Trickreich. Aber ich habe auch einen Fehler mit der falschen Anzahl von Kanälen für meinen Mat-Typ bekommen. Um den Code kugelsicher zu machen, habe ich ihn einfach als den gleichen Image-Typ des Bildes initialisiert, damit der Code darunter funktioniert.

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

imho werden Unter-Bilder leichter mit cv können :: elements Rect abgerufen. – Micka

1

Sie 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; 
} 
Verwandte Themen