Я не думаю, что вы можете сделать это для разных типов.Вам придется обращаться с типами специально.Посмотрите на функции, которые используют этот тип в источниках opencv
, и вы увидите, что они обрабатываются особым образом: например, findContours
и split
функции.
Для вашего конкретного случая std::vector<std::vector<cv::Point>>
, вы можете следовать способу findContours
.Ниже я написал простую функцию для демонстрации этого.
void testfunction(OutputArrayOfArrays contour) {
std::vector<std::vector<cv::Point>> contours;
// fill some data
std::vector<cv::Point> v1;
v1.push_back(cv::Point(10, 1));
v1.push_back(cv::Point(11, 2));
v1.push_back(cv::Point(12, 3));
std::vector<cv::Point> v2;
v2.push_back(cv::Point(20, 10));
v2.push_back(cv::Point(21, 20));
contours.push_back(v1);
contours.push_back(v2);
// output
contour.create(contours.size(), 1, 0, -1, true);
for (size_t i = 0; i < contours.size(); i++) {
std::vector<cv::Point>& v = contours[i];
contour.create(v.size(), 1, CV_32SC2, i, true);
Mat m = contour.getMat(i);
for (size_t j = 0; j < v.size(); j++) {
m.at<int>(2*j) = v[j].x;
m.at<int>(2*j+1) = v[j].y;
}
std::cout << m << std::endl;
}
}
И вывод выглядит как
[10, 1, 11, 2, 12, 3]
[20, 10, 21, 20]
2
3
[10, 1]
[11, 2]
[12, 3]
2
[20, 10]
[21, 20]
с использованием кода
std::vector<std::vector<cv::Point>> contours;
testfunction(contours);
std::cout << contours.size() << std::endl;
for (size_t i = 0; i < contours.size(); i++) {
std::vector<cv::Point>& cont = contours[i];
std::cout << cont.size() << std::endl;
for (size_t j = 0; j < cont.size(); j++) {
std::cout << cont[j] << std::endl;
}
}