twain2/ImageTranferBW.cpp

76 lines
1.4 KiB
C++

#include "stdafx.h"
#include "ImageTranferBW.h"
using namespace cv;
ImageTranferBW::ImageTranferBW(cv::Mat & mat)
{
threshold(mat, mat, 200, 255, CV_THRESH_BINARY);
float kernel_data[] = { -0.1f, 0, 0, 0, -0.1f, 0, 0, 0, 0, 0, 0, 0, 1.5f, 0, 0, 0, 0, 0, 0, 0, -0.1f, 0, 0, 0, -0.1f };
Mat kernel(5, 5, CV_32FC1, kernel_data);
filter2D(mat, mat, mat.depth(), kernel);
m_width = mat.cols;
m_height = mat.rows;
//!< Éú³ÉͼÏñ
m_buffer = new unsigned char[height()*step()];
memset(m_buffer, 0, height()*step());
unsigned char* binary = m_buffer;
int n_lineByte = (m_width + 7) >> 3;
unsigned char * imageData = mat.data;
unsigned char temp;
for (int row = 0; row < m_height; row++)
{
for (int col = 0; col < m_width; col++)
{
int pos = col % 8;
int pix = *(imageData + row * mat.step1() + col);
temp = 1 << (7 - pos);
if (pix == 255)
{
*(binary + row * m_lineByte + col / 8) |= temp;
}
else
{
*(binary + row * m_lineByte + col / 8) &= (~temp);
}
}
}
}
ImageTranferBW::~ImageTranferBW()
{
if (m_buffer != NULL)
{
delete[] m_buffer;
}
}
unsigned char * ImageTranferBW::getLineBits(int line/* = 0*/)
{
return m_buffer + step()*line;
}
int ImageTranferBW::step()
{
int n_lineByte = (m_width + 7) >> 3;
m_lineByte = ((n_lineByte * 8 + 31) >> 5) << 2;
return m_lineByte;
}
int ImageTranferBW::bpp()
{
return 1;
}
int ImageTranferBW::width()
{
return m_width;
}
int ImageTranferBW::height()
{
return m_height;
}