2014-02-28 3 views
10

Я хочу скопировать часть изображения, которое не является прямоугольником с C++ opencv. Угловые точки детали известны на изображении. Я хочу вставить его в другое изображение в точном месте. Может ли кто-нибудь помочь мне?копирование непрямоугольных roi opencv

Исходное изображение и изображение назначения имеют одинаковый размер.

вот пример исходного изображения, я знаю p1, p2, p3, p4 и хочу скопировать эту часть на новое изображение. enter image description here

У меня уже есть изображение назначения. Например, нижеследующее изображение является целевым изображением, и я хочу вставить только выделенную часть исходного изображения в целевое изображение. Как мне это сделать? enter image description here

И конечный результат должен выглядеть примерно так. enter image description here

Спасибо,

ответ

16
  1. Сначала создайте изображение маски, используя свои четыре координаты.

  2. Теперь, используя Mat::copyTo(), скопируйте свое изображение balck в исходный код здесь, вы можете использовать маску выше.

Выделяют черное изображение и маску, как размер источника

Mat src=imread("img.png",1); 
Mat black(src.rows, src.cols, src.type(), cv::Scalar::all(0)); 
Mat mask(src.rows, src.cols, CV_8UC1, cv::Scalar(0)); 

Теперь создайте маску изображения с помощью drawContours, здесь вы должны использовать CV_FILLED для толщины контура.

Как

vector< vector<Point> > co_ordinates; 
    co_ordinates.push_back(vector<Point>()); 
    co_ordinates[0].push_back(P1); 
    co_ordinates[0].push_back(P2); 
    co_ordinates[0].push_back(P3); 
    co_ordinates[0].push_back(P4); 
    drawContours(mask,co_ordinates,0, Scalar(255),CV_FILLED, 8); 

Наконец скопировать черное изображение к источнику с помощью описанной выше маски

black.copyTo(src,mask); 

Смотри ниже результата,

enter image description here

Edit:

Основываясь на ваш комментарий ниже здесь шаги вы должны следовать

  1. Сначала нужно создать маску изображения, как описано выше

  2. Скопируйте источник изображения к новому Mat dst1 с использованием маски.

  3. инвертировать маску и скопировать изображение назначения на новый Mat dst2

  4. Для окончательного результата просто сложить dest1 и dest2 к новому Мату.

    Предположим, что вы уже создали маску, как описано выше

    Скопировать на новый Мат

    Mat dst1; 
    src.copyTo(dst1,mask); 
    

Теперь инвертировать маску и скопировать изображение назначения на новый Мат

Mat dst2; 
bitwise_not(mask,mask); 
dst.copyTo(dst2,mask); 

Получить конечный результат путем добавления как

Mat result=dest1+dest2; 

В случае ваш оба изображения имеют разный размер, то вы можете использовать следующий код

Здесь вы должны использовать ROI изображения для копирования, создать маску и т.д ..

![Mat src=imread("src.png",1); 
Mat dst=imread("dest.jpg",1); 
int new_w=0; 
int new_h=0; 
if(src.cols>dst.cols) 
new_w=dst.cols; 
else 
new_w=src.cols; 

if(src.rows>dst.rows) 
new_h=dst.rows; 
else 
new_h=src.rows; 

Rect rectROI(0,0,new_w,new_h); 
Mat mask(new_h, new_w, CV_8UC1, cv::Scalar(0)); 

Point P1(107,41); 
Point P2(507,61); 
Point P3(495,280); 
Point P4(110,253); 
vector< vector<Point> > co_ordinates; 
co_ordinates.push_back(vector<Point>()); 

co_ordinates\[0\].push_back(P1); 
co_ordinates\[0\].push_back(P2); 
co_ordinates\[0\].push_back(P3); 
co_ordinates\[0\].push_back(P4); 
drawContours(mask,co_ordinates,0, Scalar(255),CV_FILLED, 8); 

Mat srcROI=src(rectROI); 
Mat dstROI=dst(rectROI); 
Mat dst1; 
Mat dst2; 

srcROI.copyTo(dst1,mask); 
imwrite("dst1.jpg",dst1); 

bitwise_not(mask,mask); 
dstROI.copyTo(dst2,mask); 

dstROI.setTo(0); 
dstROI=dst1+dst2; 
imshow("final result",dst);][4] 

enter image description here

+0

Привет Харис, спасибо за ваш добрый ответ. Но я не хочу, чтобы исходное изображение было черным. Я думаю, что мой вопрос был недостаточно объяснен. Итак, я снова отредактировал этот вопрос. спасибо – MMH

+0

Значит, ваше изображение назначения имеет разный размер? – Haris

+0

нет изображения одинакового размера. – MMH

Смежные вопросы