На заметку 0x69 хотел кредит за ответ.Я бы очень сказал, что он на самом деле не ответил на вопрос, который относится к OpenCV.
Anyhoot ... моя первая попытка ответа на StackOverFlow, так что обнажите меня.И да, я знаю, что вопрос «старый», но я обнаружил, что могу пролить свет на эту тему.То, что содержится в моем ответе, - это подход к тому, как изолировать каналы и вычесть их друг из друга.
Моя группа проекта и я находимся в центре проекта, включающего c ++ и OpenCV 2.3 (версия очень важна, поскольку OpenCV 2.1 кодируется в обычном C. Однако алгоритм не отличается)
Нам нужно было изолировать зеленый, а затем вычесть красный и синий каналы, вот как мы это сделали:
void IsolateGreen(Mat mIn, Mat& mOut)
{
Mat inImg (mIn.rows, mIn.cols, CV_8UC3, Scalar(1,2,3));
inImg.data = mIn.data;
Mat channelRed (inImg.rows, inImg.cols, CV_8UC1);
Mat channelGreen (inImg.rows, inImg.cols, CV_8UC1);
Mat channelBlue (inImg.rows, inImg.cols, CV_8UC1);
Mat outImg[] = {channelRed, channelGreen, channelBlue};
int fromTo[] = { 0,2, 1,1, 2,0};
mixChannels( &inImg, 1, outImg, 3, fromTo, 3);
mOut = (channelGreen) - (channelRed + channelBlue);
threshold(mOut, mOut, 10, 255, THRESH_BINARY);
erode(mOut, mOut, Mat(), Point (-1,-1), 1);
dilate(mOut, mOut, Mat(), Point(-1,-1), 3);
}
Я подумал, что вы могли бы использовать эти части
void IsolateGreen(Mat mIn, Mat& mOut)
{
Mat inImg (mIn.rows, mIn.cols, CV_8UC3, Scalar(1,2,3));
inImg.data = mIn.data;
Mat channelRed (inImg.rows, inImg.cols, CV_8UC1);
Mat channelGreen (inImg.rows, inImg.cols, CV_8UC1);
Mat channelBlue (inImg.rows, inImg.cols, CV_8UC1);
Mat outImg[] = {channelRed, channelGreen, channelBlue};
int fromTo[] = { 0,2, 1,1, 2,0};
mixChannels( &inImg, 1, outImg, 3, fromTo, 3);
mOut = channelGreen;
}
Важной частью здесь является функция mixChannels, подробнее о http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html?highlight=mixchannels#mixchannels
Потребовалось некоторое время, чтобы понять.И результат даст одно или несколько изображений в градациях серого, представляющих отдельные каналы.(Вы всегда можете выполнить аналогичное преобразование, чтобы получить нужный канал, смешанный с одним каналом в изображении RGB, если вы хотите видеть, что он красный. Все дело в интенсивности, эх: 3)