copyTo和clone的区别/制作mask的fillpoly函数(有问题)

OpenCV中mat::copyto( )函数使用方法

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

 

posted @ 2018-01-28 15:37  两猿社  阅读(683)  评论(0编辑  收藏  举报