mirror of http://192.168.1.51:8099/lmh188/twain3
64 lines
1.3 KiB
C++
64 lines
1.3 KiB
C++
|
#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;
|
||
|
}
|