文章目录
- 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)); //输出图形