станд :: векторв cv :: Mat - PullRequest
       15

станд :: векторв cv :: Mat

0 голосов
/ 27 марта 2019

Каков наилучший способ преобразовать вектор, содержащий значения цвета R, G и B в векторе cv :: Vec3b, в cv :: Mat?Положение пикселя не имеет значения, я просто хочу выполнить операцию cv :: split и затем поместить все три цветовых уровня в гистограмму.

Я пробовал это, но это не работает как операция разделениявозвращает cv :: Mat только с одной плоскостью цветов:

cv::Mat GetOnlyColoredPixel(cv::Mat& Gray, cv::Mat& Col) {
    std::vector<cv::Vec3b> ColorStack;
    cv::Vec3b vec;
    int nPixel = 0;

    for (int y = 0; y < Gray.rows; y++) {
        for (int x = 0; x < Gray.cols; x++) {
            if (Gray.at<unsigned char>(y, x) == 255) {
                ColorStack.push_back(Col.at<cv::Vec3b>(y, x));
                nPixel++;
            }
        }
    }

    return cv::Mat(1, nPixel, CV_8UC3, &ColorStack[0]);
}

Странно то, что у меня действительно должен быть только желтый пиксель, но при печати объекта MAT я получаю все возможные цвета.Col.at<cv::Vec3b>(y, x) возвращает правильный цвет, но в порядке RGB - я думал, OpenCV использует BGR.

Спасибо, Ян

1 Ответ

0 голосов
/ 27 марта 2019

Хорошо, возвращение не так. Этот код отлично работает:

cv::Mat GetOnlyColoredPixel(cv::Mat& Gray, cv::Mat& Col) {
std::vector<cv::Vec3b> ColorStack;
cv::Vec3b vec, vec2;

cv::imwrite("C:\\HomeC\\Test.bmp", Col);

for (int y = 0; y < Gray.rows; y++) {
    for (int x = 0; x < Gray.cols; x++) {
        if (Gray.at<unsigned char>(y, x) == 255) {
            //ColorStack.push_back(Col.at<cv::Vec3b>(y, x));
            vec = Col.at<cv::Vec3b>(y, x);
            ColorStack.push_back(vec);
        }
    }
}

cv::Mat RetVal = cv::Mat(1, ColorStack.size(), CV_8UC3);
memcpy(RetVal.data, ColorStack.data(), ColorStack.size() * sizeof(cv::Vec3b));
return RetVal;
}
...