Обратная заливка изображения в OpenCV - PullRequest
1 голос
/ 15 августа 2011

Я новичок в OpenCv и использую его для небольшого проекта.

Я намереваюсь заполнить одноканальное изображение повсюду, за исключением области прямоугольника внутри изображения.

У меня две проблемы.

1) Заполнение одноканального изображения черным.(cvSet не будет работать на одном канале)

2) Выполнение заливки по всему изображению, за исключением области прямоугольника внутри изображения.

Какие-либо решения?

Ответы [ 2 ]

3 голосов
/ 15 августа 2011

Вот программа, которая показывает, как заполнить один канал черным, а также как установить изображение для черного с помощью маски.

#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"

int main(int argc, const char * argv[]) {

    cv::Mat image;
    image = cv::imread("../../lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);

    if (!image.data) {
        std::cout << "Image file not found\n";
        return 1;
    }

    cv::namedWindow("original");
    cv::imshow("original", image);

    //Define the ROI rectangle
    cv::Rect ROIrect(100, 100, 200, 200);

    //Create a deep copy of the image
    cv::Mat fill(image.clone());
    //Specify the ROI
    cv::Mat fillROI = fill(ROIrect);
    //Fill the ROI with black
    fillROI = cv::Scalar(0);

    cv::namedWindow("fill");
    cv::imshow("fill", fill);
    cvMoveWindow("fill", 500, 40);

    //create a deep copy of the image
    cv::Mat inverseFill(image.clone());
    //create a single-channel mask the same size as the image filled with 1
    cv::Mat inverseMask(inverseFill.size(), CV_8UC1, cv::Scalar(1));
    //Specify the ROI in the mask
    cv::Mat inverseMaskROI = inverseMask(ROIrect);
    //Fill the mask's ROI with 0
    inverseMaskROI = cv::Scalar(0);
    //Set the image to 0 in places where the mask is 1
    inverseFill.setTo(cv::Scalar(0), inverseMask);

    cv::namedWindow("inverseFill");
    cv::imshow("inverseFill", inverseFill);
    cvMoveWindow("inverseFill", 1000, 40);
    // wait for key
    cv::waitKey(0);

    return 0;
}
0 голосов
/ 15 августа 2011

Вложенный для циклов действительно будет самым быстрым способом.

В противном случае, рассмотрите возможность создания буфера одинакового размера, который очищается с использованием cvZero (все черного цвета).Затем установите RROI для региона, который вам нужен, и cvCopy во временный буфер.

Битовая маска с cvAnd также является хорошим и чистым решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...