twain3/ImageProcess/ImageMultiOutputRed.cpp

64 lines
1.3 KiB
C++
Raw Permalink Normal View History

#include "ImageMultiOutputRed.h"
#include <vector>
using namespace std;
ImageMultiOutputRed::ImageMultiOutputRed(short channelIndex)
{
m_channelIndex = channelIndex;
}
ImageMultiOutputRed::~ImageMultiOutputRed(void)
{
}
std::vector<cv::Mat> ImageMultiOutputRed::apply(cv::Mat& pDib)
{
std::vector<cv::Mat> 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;
}