cv::point cv::Point2f
时间: 2023-08-24 13:08:59 浏览: 278
cv::Point是OpenCV库中的一个类,表示一个二维平面上的点,它具有整数类型的坐标。而cv::Point2f也是OpenCV库中的一个类,表示一个二维平面上的点,但它的坐标类型是浮点数。两者的主要区别在于坐标类型的不同,一个是整数类型,一个是浮点类型。根据具体的需求,可以选择使用cv::Point或cv::Point2f来表示二维平面上的点。
相关问题
如何声明模板函数,并规定可以使用的类型只能为cv::Point2f[4]和std::vectorcv::point2f
要声明一个模板函数,并规定可以使用的类型只能为cv::Point2f[4]和std::vector<cv::Point2f>,您可以使用std::enable_if和std::is_same来限制模板参数的类型。以下是一个示例:
```
#include <iostream>
#include <vector>
#include <type_traits>
#include <opencv2/opencv.hpp>
template<typename T, typename = typename std::enable_if<std::is_same<T, cv::Point2f[4]>::value || std::is_same<T, std::vector<cv::Point2f>>::value>::type>
void printPoints(T points) {
for (auto& point : points) {
std::cout << "(" << point.x << ", " << point.y << ")" << std::endl;
}
}
int main() {
cv::Point2f points[4] = { cv::Point2f(0, 0), cv::Point2f(1, 1), cv::Point2f(2, 2), cv::Point2f(3, 3) };
std::vector<cv::Point2f> pointsVector = { cv::Point2f(0, 0), cv::Point2f(1, 1), cv::Point2f(2, 2), cv::Point2f(3, 3) };
std::cout << "Printing cv::Point2f[4]:" << std::endl;
printPoints(points);
std::cout << "Printing std::vector<cv::Point2f>:" << std::endl;
printPoints(pointsVector);
// The following code will not compile because it uses an invalid type
//int invalidPoints[4] = { 0, 1, 2, 3 };
//printPoints(invalidPoints);
return 0;
}
```
在这个示例中,我们使用std::enable_if和std::is_same来检查模板参数T是否为cv::Point2f数组或std::vector<cv::Point2f>,如果是,则可以使用该函数。如果不是,则编译器将抛出一个错误。
在主函数中,我们创建了一个cv::Point2f数组和一个std::vector<cv::Point2f>,然后分别调用了printPoints函数来打印它们的内容。我们还注释掉了使用无效类型的代码,以说明该函数只能使用cv::Point2f数组或std::vector<cv::Point2f>。
希望这个示例可以帮助您理解如何声明模板函数,并规定可以使用的类型只能为cv::Point2f[4]和std::vector<cv::Point2f>!
//显示结果 imshow("轮廓绘制结果", edge); vector<Point2f>point_0; vector<Point2f>point_1; vector<Point2f>point_2; vector<Point2f>point_3; vector<Point2f>point_4; vector<Point2f>point_5; vector<Point2f>point_6; vector<Point2f>point_7; vector<Point2f>point_8; vector<Point2f>point_9; vector<Point2f>point_10; vector<Point2f>point_11; vector<Point2f>point_12; vector<Point2f>point_13; vector<Point2f>point_14; vector<Point2f>point_15; vector<Point2f>point_16; vector<Point2f>point_17; vector<Point2f>point_18; vector<Point2f>point_19; int m, n; for (m = 0; m < contours.size(); m++) { for (n = 0; n < contours[m].size(); n++) { switch (m) { case 0: point_0.push_back(contours[m][n]); break; case 1: point_1.push_back(contours[m][n]); break; case 2: point_2.push_back(contours[m][n]); break; case 3: point_3.push_back(contours[m][n]); break; case 4: point_4.push_back(contours[m][n]); break; case 5: point_5.push_back(contours[m][n]); break; case 6: point_6.push_back(contours[m][n]); break; case 7: point_7.push_back(contours[m][n]); break; case 8: point_8.push_back(contours[m][n]); break; case 9: point_9.push_back(contours[m][n]); break; case 10: point_10.push_back(contours[m][n]); break; case 11: point_11.push_back(contours[m][n]); break; case 12: point_12.push_back(contours[m][n]); break; case 13: point_13.push_back(contours[m][n]); break; case 14: point_14.push_back(contours[m][n]); break; case 15: point_15.push_back(contours[m][n]); break; case 16: point_16.push_back(contours[m][n]); break; case 17: point_17.push_back(contours[m][n]); break; case 18: point_18.push_back(contours[m][n]); break; case 19: point_19.push_back(contours[m][n]); break; default: cout << "input error" << endl; } } } Mat img(321, 432, CV_8UC1, cv::Scalar(0));
这段代码创建了一个大小为321x432的单通道图像img,并将所有像素值初始化为0。在之前的代码中,找到了一些轮廓(contours),然后将每个轮廓的所有点按照其所在的轮廓编号(m)分别存储到了对应的vector<Point2f>中。现在,这段代码的作用是根据这些点的坐标信息,在img图像上绘制出对应的轮廓线条。具体的绘制方法可以通过OpenCV的绘图函数实现,例如cv::line()和cv::polylines()等。
阅读全文