2012-06-12 13 views
25

Czy istnieje funkcja OpenCV do narysowania obrazu na innym obrazie? Mam jedno duże zdjęcie typu Mat. Mam mały obrazek o typie Mat (5x7). Chcę narysować ten mały obraz na dużym obrazie pod określonym numerem coordinates.OpenCV narysować obrazek na innym obrazku

+11

Proszę przyjąć niektóre odpowiedzi lub powiedz, dlaczego nie działają. Staraj się nie pozostawiać tego miejsca otwartego na cmentarz. –

Odpowiedz

39

Użyj Mat::rowRange() i Mat::colRange(), aby określić obszar, na który chcesz narysować w miejscu docelowym Mat. Kod:

Mat src(5, 7, CV_8UC1, Scalar(1)); // 5x7 
Mat dst(10, 10, CV_8UC1, Scalar(0)); // 10x10 

src.copyTo(dst.rowRange(1, 6).colRange(3, 10)); 

wyników w następujących przypadkach:

przed copyTo():

dst: 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 0 0 0 0 0 0 0) 

po copyTo():

dst: 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 1 1 1 1 1 1 1) 
    (0 0 0 1 1 1 1 1 1 1) 
    (0 0 0 1 1 1 1 1 1 1) 
    (0 0 0 1 1 1 1 1 1 1) 
    (0 0 0 1 1 1 1 1 1 1) 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 0 0 0 0 0 0 0) 
    (0 0 0 0 0 0 0 0 0 0) 
+2

'a.copyTo (big.colRange (51,55) .rowRange. (63,69))' dla '5x7' –

+0

Dziękuję bardzo! – vitaly

+1

Perfect One liner !! – user2727765

35

Tworzenie obszarze zainteresowania w dużym obrazie, a następnie skopiować mały obraz do tego regionu:

cv::Rect roi(cv::Point(originX, originY), cv::Size(width, height)); 
cv::Mat destinationROI = bigImage(roi); 
smallImage.copyTo(destinationROI); 

Jeżeli jesteś pewien mały obraz pasuje do wielkiego obrazu, a następnie można po prostu zrobić:

cv::Rect roi(cv::Point(originX, originY), smallImage.size()); 
smallImage.copyTo(bigImage(roi)); 
+1

To niestety nie działa dla mnie, pojawia się błąd: 'error: no matching function dla wywołania 'cv :: Mat :: copyTo (cv :: Mat)'. I oferuje kandydatów otrzymujących cv :: OutputArray zamiast tego, kiedy patrzę na http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#cv-mat-copyto, wydaje się, że bierze Mat jako argument, ale ja dostać ten błąd? – pbond

2

Oto rozwiązanie w wersji java OpenCV

Rect roi= new Rect(originX,originY,smalImage.width(),smallImge.height()); 
smallImage.copyTo(new Mat(input,roi));