Скопируйте один объект OpenCV OutputArrayOfArrays в другой - PullRequest
0 голосов
/ 04 апреля 2019

Я хочу скопировать один объект OutputArrayOfArrays в другой.Примерно так:

void function(OutputArrayOfArrays contour) {
    std::vector<std::vector<cv::Point>> contours;
    OutputArrayOfArrays _contour(contours);

    ....Doing something....

    contour = _contour;
}

Но я получаю следующую ошибку:

no viable overloaded '='
    contour = _contour;

1 Ответ

0 голосов
/ 04 апреля 2019

Я не думаю, что вы можете сделать это для разных типов.Вам придется обращаться с типами специально.Посмотрите на функции, которые используют этот тип в источниках 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...