我想获取两个图像中位于三角形内部的部分的颜色,并用它们的平均值在相同位置绘制另一个三角形。以下代码在图像中绘制一个三角形:
#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;
}
我想获取三角形中包含的每个像素的颜色,该颜色可以在图像的任何位置。
有人知道该怎么做吗?
答案 0 :(得分:1)
有时将图像处理视为数学而非图像是有帮助的...因此,如果仅对2个输入图像进行平均,您将获得所有位置的平均颜色。然后,如果您只希望答案在三角形内,请使其在三角形内具有1
的像素值,在其他任何地方都具有0
的像素值。然后将平均图像乘以三角形图像,它将在三角形外部变黑(乘以零),而成为三角形内部的平均值(乘以1)。
因此,仅使用未编译/未经测试的伪代码:
// 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;