cv::Point_<int>::Point_(int, int, cv::Scalar, int)’
时间: 2024-05-31 08:13:52 浏览: 117
这个错误是因为 `cv::Point_<int>::Point_(int, int, cv::Scalar, int)` 这个构造函数是不存在的。
`cv::Point_<int>` 类型的对象只有两个整型参数的构造函数,可以使用 `cv::Point_<int> pt(x, y);` 来构造一个二维坐标点。
如果你想要使用带有 `cv::Scalar` 和 `int` 类型参数的构造函数,你可以使用 `cv::Vec` 类型来表示带有多个元素的向量,例如 `cv::Vec<int, 4> vec(1, 2, 3, 4);`。
相关问题
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));
这段代码的作用是将轮廓(contours)中的点按照所属的轮廓编号(m)存储到不同的vector中。每个轮廓都有一个对应的vector存储其所有的点。最后根据存储的点绘制一个大小为321x432的灰度图像(img)。其中CV_8UC1表示每个像素用8位无符号整数表示,即灰度图像;cv::Scalar(0)表示初始化所有像素值为0,即黑色。
帮我写一个C++程序,我有一个候选框容器,std::vector<cv::Rect> bboxes;还有这些框的中心点容器std::vector<cv::Point> centers,这些我都已经计算好可以当作输入,我想使用dbscan聚类把小框融合成大框,麻烦帮我写一个程序。
好的,这里是一个使用dbscan聚类进行目标框融合的C++程序,需要 OpenCV 库和 dbscan 库的支持。
```c++
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
#include "dbscan.h"
using namespace std;
using namespace cv;
int main()
{
// 输入数据
vector<Rect> bboxes = { Rect(10,10,20,20), Rect(20,20,30,30), Rect(30,30,40,40),
Rect(100,100,20,20), Rect(120,120,30,30), Rect(140,140,40,40),
Rect(200,200,20,20), Rect(220,220,30,30), Rect(240,240,40,40) };
vector<Point> centers;
for (auto bbox : bboxes) {
centers.push_back(Point(bbox.x + bbox.width / 2, bbox.y + bbox.height / 2));
}
// dbscan 聚类参数
double eps = 50; // 半径
int minPts = 2; // 最小密度
// dbscan 聚类
int n = centers.size();
vector<int> labels;
DBSCAN epsCluster(eps, minPts, centers);
epsCluster.run(labels);
// 将同一类别的目标框合并
int max_label = *max_element(labels.begin(), labels.end());
vector<Rect> result(max_label + 1, Rect());
for (int i = 0; i < n; i++) {
if (labels[i] != -1) {
if (result[labels[i]].area() == 0) {
result[labels[i]] = bboxes[i];
}
else {
result[labels[i]] |= bboxes[i];
}
}
}
// 显示结果
Mat img(500, 500, CV_8UC3, Scalar(255, 255, 255));
for (auto box : result) {
rectangle(img, box, Scalar(0, 0, 255), 2);
}
imshow("result", img);
waitKey(0);
return 0;
}
```
这个程序将输入的目标框中心点作为 dbscan 聚类的输入,聚类后将同一类别的目标框合并成一个大框,并在图像上显示结果。你可以根据需要修改输入数据和 dbscan 聚类参数。
阅读全文