OpenCV的fillPoly函数
使用OpenCV库进行图像处理时,经常会用到clone和copyTo函数,这里对两个函数进行介绍。
- copyTo函数
实现和clone一样的功能,但一般多用于掩模贴图:
1 Mat src = imread(imagepath); 2 Mat src_temp; 3 src.copyTo(src_temp);
另外用途最广的是它的贴图功能:
1 src.copyTo(src_temp, mask);
其中mask为一个二值的掩模图像,如果如果在某个像素点(i, j)其值为1,则把src中对应位置的像素复制到src_temp中,其余为0的位置像素保持不变。在制作mask时,将感兴趣区域填充为白色,其余部分为黑色可以使用fillpoly函数。
- fillPoly函数
1 #include <iostream> 2 #include <opencv2/opencv.hpp> 3 4 using namespace cv; 5 using namespace std; 6 7 8 int main() 9 { 10 Mat src = imread("02.jpg"); 11 12 Point root_points[1][6]; //这里有一个问题,如果数组内的数据个数事先不知道,需要开辟很大的数组,占用内存 13 root_points[0][0] = Point(215, 220); 14 root_points[0][1] = Point(460, 225); 15 root_points[0][2] = Point(466, 450); 16 root_points[0][3] = Point(235, 465); 17 root_points[0][4] = Point(260, 390); 18 root_points[0][5] = Point(96, 310); 19 20 const Point* ppt[1] = { root_points[0] }; 21 int npt[] = { 6 }; 22 23 //生成原图大小的全黑图像 24 cv::Mat mask_ann, dst; 25 src.copyTo(mask_ann); 26 mask_ann.setTo(cv::Scalar::all(0)); 27 28 fillPoly(mask_ann, ppt, npt, 1, Scalar(255, 255, 255)); 29 imshow("mask_ann", mask_ann); 30 src.copyTo(dst, mask_ann); 31 imshow("dst", dst); 32 waitKey(); 33 return 0; 34 }
- clone函数
分析源码可以看出,该函数的实现是copyTo的第一种用法:
1 inline Mat Mat::clone() const 2 { 3 Mat m; 4 copyTo(m); 5 return m; 6 }
多用于复制图片,比如读入一张图像,对其进行处理时,只是想看下效果并不像让原图发生变化,这时候可以重新声明如下:
1 Mat src = imread(imagepath); 2 Mat src_temp = src.clone();