将一个 OpenCV OutputArrayOfArrays 对象复制到另一个对象

Copy one OpenCV OutputArrayOfArrays object to another

本文关键字:复制 对象 一个对象 OutputArrayOfArrays OpenCV 一个      更新时间:2023-10-16

我想将一个 OutputArrayOfArrays 对象复制到另一个对象。像这样:

void function(OutputArrayOfArrays contour) {
    std::vector<std::vector<cv::Point>> contours;
    OutputArrayOfArrays _contour(contours);
    ....Doing something....
    contour = _contour;
}

但是我收到以下错误:

no viable overloaded '='
    contour = _contour;

我认为你不能为不同的类型做到这一点。您必须专门处理类型。查看在opencv源中使用此类型的函数,您会发现它们以特定方式处理:例如,findContourssplit函数。

对于您的特定情况 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;
    }
}