Цвет в положении треугольника - PullRequest
1 голос
/ 30 апреля 2019

Я хочу получить цвет части двух изображений, которые находятся внутри треугольника, и сделать еще один треугольник в той же позиции со средним из них. Следующий код рисует треугольник на изображениях:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main( int argc, char** argv){


  Scalar color(0,0,255);
  Point2f p0(50,50),p1(100,50), p2(50,100);

  Mat img1 = imread("img1.png");
  Mat img2 = imread("img2.png");
  Mat triangle(img1.rows,img1.cols,img1.type());
  triangle.setTo(color);

  line(img1, p0, p1, color, 1, CV_AA, 0);
  line(img1, p1, p2, color, 1, CV_AA, 0);
  line(img1, p2, p0, color, 1, CV_AA, 0);

  line(img2, p0, p1, color, 1, CV_AA, 0);
  line(img2, p1, p2, color, 1, CV_AA, 0);
  line(img2, p2, p0, color, 1, CV_AA, 0);

   // if contain triangle get the color of two images
   // triangle[i][j] = (img1[i][j] + img2[i][j])/2 ;



  imwrite("out1.png",img1);
  imwrite("out2.png",img2);
 // imwrite( "triangle.png",triangle);

  return 0;
}

Я хочу получить цвет каждого пикселя, содержащегося в треугольнике, который может находиться в любом месте изображения.

Кто-нибудь знает, как это сделать?

1 Ответ

1 голос
/ 01 мая 2019

Иногда это помогает думать об обработке изображений как о математике, а не об изображениях ... поэтому, если вы просто усредните свои 2 входных изображения, вы получите средний цвет во всех местах. Затем, если вы хотите получить ответ только внутри треугольника, сделайте так, чтобы у треугольника были значения пикселей 1 внутри треугольника и 0 везде. Затем умножьте усредненное изображение на изображение треугольника, и оно будет черным за пределами треугольника (от умножения на ноль), и будет просто средним значением внутри треугольника (от умножения на единицу).

Итак, просто в некомпилированном / непроверенном псевдокоде:

// Load two images
Mat img1 = imread("img1.png");
Mat img2 = imread("img2.png");

// Make black mask image
Scalar black(0,0,0);
Mat mask(img1.rows,img1.cols,img1.type());
mask.setTo(black);

// Draw triangle filled with value "1" in mask 
Point vertices[1][3];
vertices[0][0] = Point( 50, 50  );
vertices[0][1] = Point( 100, 50 );
vertices[0][2] = Point( 50, 100 );

const Point* ppt[1] = { vertices[0] };
int npt[] = { 3 };
fillPoly( mask, ppt, npt, 1, Scalar( 1, 1, 1 ), 8 );

Mat result;
result = mask * (img1 + img2) / 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...