文章目录

  • opencv常见函数使用
  • 1. findcontours/drawcontours函数
  • 常用
  • 1、遍历图像像素点(灰度图,RGB)
  • 2、字符串查找替换
  • 3、遍历
  • 4、map
  • 5、main函数含参数
  • 2、Mat 创建图像


opencv常见函数使用

1. findcontours/drawcontours函数

Mat img = image.clone(); //灰度图
vector<vector<cv::Point>> contours;
findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
Mat image_drawfindcontours = Mat::zeros(img.rows, img.cols, CV_8UC1);
drawContours(image_drawfindcontours, contours_tmp, -1, cv::Scalar::all(255), 8);//8
findContours(img_threshold, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); 

第一个参数:image,单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像;

第二个参数:contours,定义为“vector<vector<Point>> contours”,是一个向量,并且是一个双重向量,向量内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓。有多少轮廓,向量contours就有多少元素。

第三个是轮廓检索模式:
RETR_LIST 从解释的角度来看,这中应是最简单的。它只是提取所有的轮廓,而不去创建任何父子关系。
RETR_EXTERNAL 如果你选择这种模式的话,只会返回最外边的的轮廓,所有的子轮廓都会被忽略掉。
RETR_CCOMP 在这种模式下会返回所有的轮廓并将轮廓分为两级组织结构。
RETR_TREE 这种模式下会返回所有轮廓,并且创建一个完整的组织结构列表。它甚至会告诉你谁是爷爷,爸爸,儿子,孙子等。

第四个是轮廓近似方法:
如果设为cv2.CHAIN_APPROX_NONE,,表示边界所有点都会被储存;
如果设为cv2.CHAIN_APPROX_SIMPLE 会压缩轮廓,将轮廓上冗余点去掉,比如说四边形就会只储存四个角点
drawContours(src, contours, -1, cv::Scalar::all(255),2);
第一个参数是一张图片,可以是原图或者其他。

第二个参数是轮廓,也可以说是cv2.findContours()找出来的点集,一个列表。

第三个参数是对轮廓(第二个参数)的索引,当需要绘制独立轮廓时很有用,若要全部绘制可设为-1。

接下来的参数是轮廓的颜色和厚度。

常用

1、遍历图像像素点(灰度图,RGB)

2、字符串查找替换

3、遍历

4、map

5、main函数含参数

1、遍历图像像素点

1)灰度图
Mat img = image.clone();
int num_rows = img.rows;
int num_cols = img.cols*img.channels();
for (int j = 0; j < num_rows; j++) {
	uchar* pt = img.ptr<uchar>(j);
	for (int i = 0; i < num_cols; i++) {
		//对像素进行某些操作
		if (pt[i] != 251)
			pt[i] = 0;
	}
}

2)灰度图
for (int i = 0; i < src.rows; i++)
{
	for (int j = 0; j < src.cols; j++)
	{
		
		if (((i + k) < src.rows) && ((j + m) < src.cols) && (src.at<uchar>(i + k, j + m) == 0))//如果卷结核范围未超出图像,同时某个像素值==0,则将卷积核中心像素值置零,然后跳出卷积核循环;
		{
			dst.at<uchar>(i + size / 2, j + size / 2) = 0;
			flag = true;
		}

			
	}

}

3)读取RGB像素值

Mat img = imread("fruits.jpg");
int rowNumber = img.rows;
int colNumber = img.cols;
for (int i = 0; i < rowNumber; i++)  
{  
    for (int j = 0; j < colNumber; j++)  
    {  
  		// Vec3b pix = img.at<Vec3b>(i,j);
        if (srcImage.at<Vec3b>(i, j)[0] > 180)   
        {  
            srcImage.at<Vec3b>(i, j)[0] = 0;            
        }  
          
        if (srcImage.at<Vec3b>(i, j)[1] < 50)   
        {  
            srcImage.at<Vec3b>(i, j)[1] = 255;  
        }  
  
        if (srcImage.at<Vec3b>(i, j)[2] < 120)   
        {  
            srcImage.at<Vec3b>(i, j)[2] = 0;  
        }  
  
    }  
} 


2、字符串查找替换:

1)字符串查找

1. size_t n = str.find(s1);? ?//?由前向后查找 str 中第一次出现 s1 的位置,并返回;

2.?size_t n = str.rfind(s1);? ?// 由后向前查找 str 中第一次出现 s1 的位置,并返回;

3. size_t n = str.find_first_of(s1);? ?// 查找 s 中任意一个字符在?str 中,由前向后,第一次出现的位置,并返回;

4.?size_t n = str.find_last_of(s1);? ?// 查找 s 中任意一个字符在?str 中,由后向前,第一次出现的位置,并返回;

5. size_t n = str.find_first_not_of(s1);? ?// 由前向后,查找 str 中第一个不属于?s1 中的字符的位置,并返回;

6.?size_t n = str.find_last_not_of(s1);? ?// 由后向前,查找 str 中第一个不属于?s1 中的字符的位置,并返回;

2)字符串替换

str.replace(pos, n, s1);? // 用 s1 替换 str 中从 pos 开始的 n 个字符的子串;

3)截取字符串

1. str.substr(pos, n);? // 截取 str 中由 pos 开始的 n 个字符的子串,并返回;

2. str.substr(pos);? ?// 截取 str 中由 pos ?开始到末尾的所有字符串的子串,并返回;



3、遍历
	vector<cv::String> filenames;
	narrow_lane narrow_lane;
	

	glob(input_path, filenames, true); //此处输出为全部路径,参数 true or false 都是全部路径
	int num = 1;
	for (int i = 0; i < filenames.size(); i++){

		//cout << filenames[i] << endl;
		int str_begin1 = filenames[i].find_last_of('\\');
		int str_begin2 = filenames[i].find_last_of('.');
		int str_end = filenames[i].size();
		std::string filename_base = filenames[i].substr(str_begin1 + 1, str_begin2 - str_begin1-1);
		cv::String save_path = output_path + "/" + filename_base + ".png";
		cout << save_path << " " << num << endl;
		
4、map
map <string, int> img_class{
	{ "1654242", 1 },
{ "01920", 2 }}


5、main函数参数

int main(int argc, char** argv)
	{
		if (argc != 5)
		{
			cout << "argv error" << endl;
		}

		//string input_path = "C:/Users/xujun/Desktop/C++/rgbTogray/rgb_To_gray/data/img_rgb/";
		//string out_path = "C:/Users/xujun/Desktop/C++/rgbTogray/rgb_To_gray/data/img_rgb/";
		string input_path;
		string out_path;
		for (int i = 0; i < argc; i++)
		{
			if (!strcmp(argv[i], "-i"))
				input_path = argv[++i];
			else if (!strcmp(argv[i], "-o"))
				out_path = argv[++i];

		}

	}
6、c++ubuntu编译 g++
g++ - std = c++11 rgb_to_gray.cpp - I / usr / local / include / opencv - L / usr / local / lib - lopencv_core - lopencv_highgui - lopencv_imgcodecs - o rgb_to_gray

2、Mat 创建图像

Mat img_out(img_in.rows, img_in.cols, CV_8UC3, Scalar(0, 0, 0));  //输出图形