#include "ImageMultiOutputRed.h" #include using namespace std; ImageMultiOutputRed::ImageMultiOutputRed(short channelIndex) { m_channelIndex = channelIndex; } ImageMultiOutputRed::~ImageMultiOutputRed(void) { } std::vector ImageMultiOutputRed::apply(cv::Mat& pDib) { std::vector retMats; if (pDib.empty()) return retMats; retMats.push_back(pDib); cv::Mat mat = FilterColor(pDib, m_channelIndex); if (!mat.empty()) retMats.push_back(mat); return retMats; } cv::Mat ImageMultiOutputRed::FilterColor(cv::Mat image, short channel) { cv::Mat dstImage(image.rows, image.cols, CV_8UC1); int channels = image.channels(); if (channel > channels - 1) { return cv::Mat(); } if ((channel == 3) && (channels != 4) && (channels != 8)) { return cv::Mat(); } if (channels <= 4) { int srcOffset = image.step - image.cols * channels; int dstOffset = dstImage.step - dstImage.cols; unsigned char *src = image.data; unsigned char *dst = dstImage.data; src += channel; for (int y = 0; y < image.rows; y++) { for (int x = 0; x < image.cols; x++, src += channels, dst++) { unsigned short pix = *src; if (pix >= 130) { pix = 255; } *dst = pix; } src += srcOffset; dst += dstOffset; } } return dstImage; }