Как получить интересующую область в 3 каналах при захвате изображений с помощью компьютерного зрения? - PullRequest
0 голосов
/ 14 сентября 2018

Я изучаю компьютерное зрение. Я получаю ROI в моноканале, как это (см. Я рассчитываю средний цвет пикселя образца.)

std::string path = "C:\\image\\Lenna.png";
cv::Mat mImage = cv::imread(path);
cv::Mat mImage_mono;
cv::cvtColor(mImage, mImage_mono, CV_RGB2GRAY);
int width = mImage_mono.cols;
int height = mImage_mono.rows;
unsigend char * PImage = mImage_mono.data
const int kernel_size = 100;
const int kernel_size_half = 100/2;
int sum
int avg
sum = 0;

for (int row = height / 2 - kernel_size_half; row < height / 2 + kernel_size_half; row++) {
        for (int col = width / 2 - kernel_size_half; col < width / 2 + kernel_size_half; col++)
        {
            int index = row * width + col;
            sum+= pImage[index];
        }
    }
    avg = sum / (kernel_size * kernel_size);

Я хочу получить ROI в 3 каналах (R, G, B), таких как моноканалы (я хочу использовать код for), и я хочу что-то вроде распознавания лиц только в ROI. В 3-х каналах я должен учитывать массив. Я знаю, что массив принимает порядок данных (B, G, R). Поэтому я думаю, что я должен умножить 3 на ширину и высоту, и я делаю это, но не работаю правильно. Как я могу получить ROI в нескольких каналах, не используя функцию "cv :: cvSetImageROI"?

1 Ответ

0 голосов
/ 14 сентября 2018

Хотите разделить изображение по цветному каналу и получить ROI каждого канала?

cv::Rect r(0, 0, roi_width, roi_height);
cv::Mat bgr[3];
cv::Mat b_roi;
cv::split(image, bgr);
b_roi = bgr[0](r);  // get the ROI of blue channel

Надеюсь, это поможет

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