копирование непрямоугольной roi opencv

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

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

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

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

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

Спасибо,

11

Решение

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

  2. Сейчас использую Mat :: CopyTo () Скопируйте свое изображение Балька в источник здесь вы можете использовать выше маски.

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

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);

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

введите описание изображения здесь

Редактировать :

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

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

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

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

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

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

    Скопировать источник в новый мат

    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]

введите описание изображения здесь

18

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]