Я нахожусь в процессе разделения изображения на области прямоугольников, я нашел некоторый полезный код, который позволяет мне это сделать, однако у меня возникают проблемы с выяснением, как манипулировать каждой отдельной областью, и восстановлением их обратновместе, чтобы сформировать новое полное изображение того же размера оригинала.Я довольно плохо знаком с c ++ и opencv, поэтому любая помощь будет принята с благодарностью.
В настоящее время все прямоугольники хранятся в std::vector<cv::Mat> *blocks
.
. Причина, по которой я хочу получить значениякаждый прямоугольник и возможность манипулировать ими объясняется тем, что я планирую позже проанализировать их для некоторого вывода.
Этот код разбивает изображение на прямоугольники:
if(img.cols % colDivisor == 0 && img.rows % colDivisor == 0){
for(int y = 0; y < img.cols; y += img.cols/colDivisor){
for(int x = 0; x < img.rows; x += img.rows/rowDivisor){
blocks->push_back(img(cv::Rect(y, x, (img.cols / colDivisor), (img.rows / rowDivisor))).clone());
rectangle(maskImg, cv::Point(y,x), cv::Point(y + (maskImg.cols / colDivisor) - 1, x + (maskImg.rows / rowDivisor) - 1), CV_RGB(255, 0, 0), 1);
cv::imshow("Image", maskImg);
Я могу манипулировать значениями BGR выбранного изображения следующим образом:
std::vector<cv::Mat> m;
...
cv::Mat image2 =m[9]; //Random rect
std::vector<cv::Mat> channels;
cv::split(image2, channels);
cv::Scalar avg1 = cv::mean(channels[0]);
cv::Scalar avg2 = cv::mean(channels[1]);
cv::Scalar avg3 = cv::mean(channels[2]);
std::cout << "Blue channel: " << avg1[0] << std::endl << "Green channel: " << avg2[0] << std::endl << "Red channel: " << avg3[0] << std::endl;
image2.setTo(cv::Scalar(avg1[0], avg2[0], avg3[0]));
cv::imshow("BGRTEST", image2);
Как видно из приведенного выше кода, я успешно могу манипулировать одной областью, однако я хочу перебирать каждую областьи применить к нему среднее значение BGR.
Как я могу это сделать?
Я пытался использовать итератор c ++, например так:
for(std::vector<cv::Mat>::iterator it = blocks->begin(); it != blocks->end(); ++it){
}
Однако я не уверен, как бы я это реализовалтакая вещь.
Заранее спасибо!