如果您已经有了要替换的点甚至更好的轮廓(例如在第二张图片中以绿色绘制的这些),请查看inpaint:http://docs.opencv.org/3.1.0/d1/d0d/group__photo.html#gaedd30dfa0214fec4c88138b51d678085
我认为这正是您想要的!示例见此处:https://en.wikipedia.org/wiki/Inpainting
过程很简单:
- 制作一个填充了您的轮廓(
drawContours,厚度:CV_FILLED)的蒙版,并用它们各自的环境进行修复/替换和
-
inpaint 带着这个面具。
我应该提一下,这仅适用于 8 位图像。
下面的(未经测试的)代码 sn-p 应该可以做到。
Mat mask = Mat::zeros(img.size(), CV_8UC1);
for (int i = 0; i < contours.size(); i++)
drawContours(mask, contours, i, Scalar::all(255), CV_FILLED);
Mat dst;
double radius = 20;
inpaint(img, mask, dst, radius, INPAINT_NS);
//inpaint(img, mask, dst, radius, INPAINT_TELEA);
imshow("dst", dst);
waitKey();
编辑:制作几个点的轮廓:
轮廓只是一个点向量,打包到另一个向量中。所以,解决方案应该是这样的,给定vector<Point> points。
vector<vector<Point> > contours;
contours.push_back(points);
drawContours(mask, contours, 0, Scalar::all(255), CV_FILLED);