C++中的级联是什么意思
时间: 2023-07-28 15:07:03 浏览: 51
在 C++ 中,级联(Cascading)是指通过一个对象调用其成员函数时,返回值是该对象本身的一种语法特性。
通常情况下,调用一个对象的成员函数,需要先通过该对象的名字或指针来访问该成员函数,例如:
```cpp
myObject.myFunction();
```
或者
```cpp
myObjectPtr->myFunction();
```
而级联语法则允许我们在一个表达式中连续调用多个成员函数,例如:
```cpp
myObject.myFunction1().myFunction2().myFunction3();
```
或者
```cpp
myObjectPtr->myFunction1()->myFunction2()->myFunction3();
```
在这种情况下,每个成员函数都返回该对象本身,从而允许我们继续调用其它成员函数。这种语法特性通常用于链式编程,可以使代码更加简洁易读。
需要注意的是,级联语法只对返回值为对象本身的成员函数有效。如果成员函数返回值不是对象本身,那么级联语法将会失效。
相关问题
c++中CascadeClassifier
CascadeClassifier是OpenCV中一个用于目标检测的类,它基于Haar特征和级联分类器(Cascade Classifier)进行目标检测。CascadeClassifier可以从训练好的分类器文件中读取数据,然后使用级联分类器对输入图像进行检测,输出检测到的目标的矩形框。
在使用CascadeClassifier进行目标检测时,需要先加载分类器文件,然后使用detectMultiScale函数对输入图像进行检测。detectMultiScale函数会返回一个矩形框数组,每个矩形框表示检测到的目标位置和大小。
以下是一个使用CascadeClassifier进行人脸检测的示例代码:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
CascadeClassifier face_cascade;
if (!face_cascade.load("haarcascade_frontalface_alt.xml"))
{
printf("Error loading cascade file!");
return -1;
}
Mat img = imread("test.jpg");
std::vector<Rect> faces;
face_cascade.detectMultiScale(img, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for (size_t i = 0; i < faces.size(); i++)
{
rectangle(img, faces[i], Scalar(0, 255, 0), 2);
}
imshow("Face detection", img);
waitKey(0);
return 0;
}
```
在上面的示例代码中,我们先加载了一个人脸分类器文件“haarcascade_frontalface_alt.xml”,然后读入一张测试图像。接下来,我们使用detectMultiScale函数对图像进行人脸检测,并将检测到的人脸位置用矩形框标出。最后,我们显示标出矩形框的图像。
不使用级联分类器,测量图像中螺栓的尺寸
要测量图像中螺栓的尺寸,可以使用以下步骤:
1. 读取图像并转换为灰度图像
```c++
Mat image = imread("bolts.jpg", IMREAD_COLOR);
Mat gray_image;
cvtColor(image, gray_image, COLOR_BGR2GRAY);
```
2. 对灰度图像进行二值化处理
```c++
Mat binary_image;
threshold(gray_image, binary_image, 0, 255, THRESH_BINARY | THRESH_OTSU);
```
3. 对二值化图像进行形态学操作,去除噪声并连接目标
```c++
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(binary_image, binary_image, MORPH_OPEN, kernel);
morphologyEx(binary_image, binary_image, MORPH_CLOSE, kernel);
```
4. 对处理后的图像进行轮廓检测,并筛选出符合条件的轮廓
```c++
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(binary_image, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
vector<RotatedRect> rects;
for (size_t i = 0; i < contours.size(); i++) {
RotatedRect rect = minAreaRect(contours[i]);
if (rect.size.width > 50 && rect.size.height > 50 && rect.size.width < 200 && rect.size.height < 200) {
rects.push_back(rect);
}
}
```
5. 在原图像中画出符合条件的轮廓,并输出目标的尺寸
```c++
for (size_t i = 0; i < rects.size(); i++) {
Rect rect = rects[i].boundingRect();
rectangle(image, rect, Scalar(0, 255, 0), 2);
cout << "Bolt " << i << " size: " << rect.width << " x " << rect.height << endl;
}
```
完整代码如下:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读取图像并转化为灰度图像
Mat image = imread("bolts.jpg", IMREAD_COLOR);
Mat gray_image;
cvtColor(image, gray_image, COLOR_BGR2GRAY);
// 对灰度图像进行二值化
Mat binary_image;
threshold(gray_image, binary_image, 0, 255, THRESH_BINARY | THRESH_OTSU);
// 对二值化图像进行形态学操作
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(binary_image, binary_image, MORPH_OPEN, kernel);
morphologyEx(binary_image, binary_image, MORPH_CLOSE, kernel);
// 对处理后的图像进行轮廓检测,并筛选出符合条件的轮廓
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(binary_image, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
vector<RotatedRect> rects;
for (size_t i = 0; i < contours.size(); i++) {
RotatedRect rect = minAreaRect(contours[i]);
if (rect.size.width > 50 && rect.size.height > 50 && rect.size.width < 200 && rect.size.height < 200) {
rects.push_back(rect);
}
}
// 在原图像中画出符合条件的轮廓,并输出目标的尺寸
for (size_t i = 0; i < rects.size(); i++) {
Rect rect = rects[i].boundingRect();
rectangle(image, rect, Scalar(0, 255, 0), 2);
cout << "Bolt " << i << " size: " << rect.width << " x " << rect.height << endl;
}
// 显示结果图像
namedWindow("Detected Bolts", WINDOW_NORMAL);
imshow("Detected Bolts", image);
waitKey(0);
return 0;
}
```