1.调整msvc与mfc链接顺序,默认开启多核编译

2.添加色偏算法
This commit is contained in:
masayume 2022-12-02 10:33:39 +08:00
parent c0a7595827
commit 6c6e6152b4
8 changed files with 269 additions and 1 deletions

View File

@ -78,4 +78,6 @@
2. 开放速度优先以及画质优先模式;
2022年11月28日 jzq
1.修复单面扫描 拆分 多流除红 出图不一致问题 -- 22.11.28
2.修复跳过空白页首选项配置保存问题 -- 22.11.28
2.修复跳过空白页首选项配置保存问题 -- 22.11.28
3.调整msvc与mfc链接顺序默认开启多核编译
4.添加色偏算法

View File

@ -103,6 +103,17 @@ ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux")
add_definitions(-DTWPP_IS_DS -D_CRT_SECURE_NO_WARNINGS -D_DIRECT_BUILD -D_NOT_USE -D_AFXDLL -D_UNICODE -D_ENABLE_EXTENDED_ALIGNED_STORAGE -D_CRT_NON_CONFORMING_SWPRINTFS -D_WIN32)
#add_definitions(-DGIT_VERSION=\"${GIT_VERSION}\")
IF(CMAKE_BUILD_TYPE MATCHES "Debug")
SET(CMAKE_EXE_LINKER_FLAGS /NODEFAULTLIB:"MSVCRTd.lib;mfcs140ud.lib")
ELSE()
SET(CMAKE_EXE_LINKER_FLAGS /NODEFAULTLIB:"MSVCRT.lib;mfcs140u.lib")
ENDIF()
RW_LINK_3RD_PART_LIBRARY(mfcs140u)
RW_LINK_3RD_PART_LIBRARY(MSVCRT)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
#
add_library(huagaotwain SHARED ${DIR_SRCS} ${PROJECT_SOURCE_DIR}/exports.def ${DEV_SRC} ${IMGPROC_SRC} ${SRC} ${DIR_RC})

View File

@ -28,6 +28,7 @@ ImageMatQueue::ImageMatQueue(void)
atm_orgin_image_remains = 0;
m_dogear.reset(new CImageApplyDogEarDetection(40, 1.0, 200));
m_colorcast.reset(new CImageApplyColorCastCorrect());
m_snowflake.init(1, 1);
}
@ -202,6 +203,11 @@ void ImageMatQueue::setparam(const GScanCap& param)
// m_iaList.push_back(shared_ptr<CImageApplyHSVCorrect>(new CImageApplyHSVCorrect(CImageApplyHSVCorrect::CorrectOption::LowSaturation_Removal, true)));
//}
if (param.pixtype == 2)
{
m_iaList.push_back(m_colorcast);
}
if (param.fadeback)//&& param.pixtype == 2
{
m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyFadeBackGroudColor(100,0,param.fadeback_range)));

View File

@ -249,6 +249,7 @@ private:
GScanCap scanParam;
Device::PaperSize papersize;
std::shared_ptr<CImageApplyDogEarDetection> m_dogear;
std::shared_ptr<CImageApplyColorCastCorrect> m_colorcast;
std::vector<std::shared_ptr<CImageApply>> m_iaList; //ͼÏñ´¦Àíº¯Êý½Ó¿Ú
float fx, fy;
std::function<void(int)> m_DogEarDetection_callback;

View File

@ -0,0 +1,185 @@
#include "ImageApplyColorCastCorrect.h"
#include <fstream>
#include <iostream>
#define max(a, b) ((a) > (b) ? (a) : (b))
#define SIZE_OF_TABLE 256 * 256 * 256
CImageApplyColorCastCorrect::CImageApplyColorCastCorrect()
: m_table(new uint[SIZE_OF_TABLE])
{
std::vector<double> points_x, points_y;
points_x = { 0, 80, 175, 255 };
points_y = { 12, 85, 175, 270 };
createTable(points_x, points_y);
}
CImageApplyColorCastCorrect::CImageApplyColorCastCorrect(const std::vector<double>& points_x, const std::vector<double>& points_y)
: m_table(new uint[256 * 256 * 256])
{
createTable(points_x, points_y);
}
CImageApplyColorCastCorrect::CImageApplyColorCastCorrect(const std::string& fileName)
: m_table(new uint[256 * 256 * 256])
{
std::fstream file(fileName, std::ios::in | std::ios::binary);
if (file)
file.read(reinterpret_cast<char*>(m_table), SIZE_OF_TABLE * sizeof(uint));
file.close();
}
CImageApplyColorCastCorrect::~CImageApplyColorCastCorrect(void)
{
delete[] m_table;
}
void CImageApplyColorCastCorrect::apply(cv::Mat& pDib, int side)
{
if (pDib.channels() != 3)
return;
cv::Mat bgra;
cv::cvtColor(pDib, bgra, cv::COLOR_BGR2BGRA);
uint* ptr = bgra.ptr<uint>();
int rows = bgra.rows, cols = bgra.cols;
for (int i = 0; i < rows; i++)
{
ptr = reinterpret_cast<uint*>(bgra.ptr(i));
for (int j = 0; j < cols; j++)
ptr[j] = m_table[ptr[j] & 0x00ffffff];
}
cv::cvtColor(bgra, pDib, cv::COLOR_BGRA2BGR);
bgra.release();
}
void CImageApplyColorCastCorrect::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
{
(void)isTwoSide;
int i = 0;
for (cv::Mat& var : mats) {
if (i != 0 && isTwoSide == false)
break;
if (!var.empty())
apply(var, 0);
i++;
}
}
void CImageApplyColorCastCorrect::exportTableData(const std::string& fileName)
{
std::fstream file(fileName, std::ios::out | std::ios::binary);
if (file)
file.write(reinterpret_cast<char*>(m_table), SIZE_OF_TABLE * sizeof(uint));
file.close();
}
std::vector<double> CImageApplyColorCastCorrect::caculate(const std::vector<double>& points_x, const std::vector<double>& points_y)
{
int MaxElement = points_x.size() - 1;
//<2F><><EFBFBD><EFBFBD><E3B3A3>f
double f = points_y[0];
//<2F><><EFBFBD>
int n, m;
//double a[MaxElement][MaxElement+1];
std::vector<std::vector<double>> a;
//a.resize(MaxElement);
for (int i = 0; i < MaxElement; i++)
{
std::vector<double> b;
b.resize(MaxElement + 1);
a.push_back(b);
}
for (int i = 0; i < MaxElement; i++)
{
for (int j = 0; j < MaxElement; j++)
a[i][j] = cv::pow(points_x[i + 1], MaxElement - j);
a[i][MaxElement] = points_y[i + 1] - f;
}
int i, j;
n = MaxElement;
for (j = 0; j < n; j++)
{
double max = 0;
double imax = 0;
for (i = j; i < n; i++)
if (imax < cv::abs(a[i][j]))
{
imax = cv::abs(a[i][j]);
max = a[i][j];//<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
m = i;
}
if (cv::abs(a[j][j]) != max)
{
double b = 0;
for (int k = j; k < n + 1; k++)
{
b = a[j][k];
a[j][k] = a[m][k];
a[m][k] = b;
}
}
for (int r = j; r < n + 1; r++)
a[j][r] = a[j][r] / max;//<2F>ø<EFBFBD><C3B8>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĵ<D0B5>һ<EFBFBD><D2BB>Ԫ<EFBFBD>أ<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>Ϊ1
for (i = j + 1; i < n; i++)
{
double c = a[i][j];
if (c == 0.0) continue;
for (int s = j; s < n + 1; s++)
a[i][s] = a[i][s] - a[j][s] * c;//ǰ<><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>һ<EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>е<EFBFBD><D0B5><EFBFBD>Ԫ<EFBFBD><D4AA>Ϊ0
}
}
for (i = n - 2; i >= 0; i--)
for (j = i + 1; j < n; j++)
a[i][n] = a[i][n] - a[j][n] * a[i][j];
std::vector<double> result;
for (int k = 0; k < n; k++)
result.push_back(a[k][n]);
result.push_back(f);
return result;
}
void CImageApplyColorCastCorrect::createTable(const std::vector<double>& points_x, const std::vector<double>& points_y)
{
cv::Mat mat_rgbTable(256 * 256, 256, CV_8UC3);
uchar* ptr_mat_rgbTable = mat_rgbTable.data;
for (size_t r = 0; r < 256; r++)
for (size_t g = 0; g < 256; g++)
for (size_t b = 0; b < 256; b++, ptr_mat_rgbTable += 3)
{
ptr_mat_rgbTable[0] = b;
ptr_mat_rgbTable[1] = g;
ptr_mat_rgbTable[2] = r;
}
cv::cvtColor(mat_rgbTable, mat_rgbTable, cv::COLOR_BGR2HSV_FULL);
uchar table_data[256];
cv::Mat tableLUT(256, 1, CV_8UC1, table_data);
std::vector<double> coefficient;
coefficient = caculate(points_x, points_y);
for (int j = 0; j < 256; j++)
table_data[j] = static_cast<int>(max(0, coefficient[0] * j * j * j + coefficient[1] * j * j + coefficient[2] * j + coefficient[3]));
cv::Mat hsv_ms[3];
cv::split(mat_rgbTable, hsv_ms);
cv::LUT(hsv_ms[0], tableLUT, hsv_ms[0]);
cv::merge(hsv_ms, 3, mat_rgbTable);
cv::cvtColor(mat_rgbTable, mat_rgbTable, cv::COLOR_HSV2BGR_FULL);
cv::Mat mat_bgr32(256, 256 * 256, CV_8UC4);
cv::cvtColor(mat_rgbTable, mat_bgr32, cv::COLOR_BGR2BGRA);
memcpy(m_table, mat_bgr32.data, mat_bgr32.total() * sizeof(uint));
}

View File

@ -0,0 +1,62 @@
/*
* ====================================================
*
*
* 2022/12/01
* 2022/12/01
* v1.0 2022/12/01
* v1.1 2022/12/01
* ====================================================
*/
#ifndef IMAGE_APPLY_COLOR_CAST_CORRECT_H
#define IMAGE_APPLY_COLOR_CAST_CORRECT_H
#include "ImageApply.h"
class CImageApplyColorCastCorrect : public CImageApply
{
public:
/// <summary>
/// 默认使用 points_x = { 0, 80, 175, 255 } points_y = { 12, 85, 175, 270 }曲线创建查值表
/// </summary>
CImageApplyColorCastCorrect();
/// <summary>
/// 用户自定义查值表
/// </summary>
/// <param name="points_x">HSV色彩空间H通道曲线变换节点坐标X轴</param>
/// <param name="points_y">HSV色彩空间H通道曲线变换节点坐标Y轴</param>
CImageApplyColorCastCorrect(const std::vector<double>& points_x, const std::vector<double>& points_y);
/// <summary>
/// 从文件中加载现有查值表数据
/// </summary>
/// <param name="fileName"></param>
CImageApplyColorCastCorrect(const std::string& fileName);
virtual ~CImageApplyColorCastCorrect(void);
virtual void apply(cv::Mat& pDib, int side);
virtual void apply(std::vector<cv::Mat>& mats, bool isTwoSide);
/// <summary>
/// 导出当前查值表数据
/// </summary>
/// <param name="fileName"></param>
void exportTableData(const std::string& fileName);
private:
std::vector<double> caculate(const std::vector<double>& points_x, const std::vector<double>& points_y);
void createTable(const std::vector<double>& points_x, const std::vector<double>& points_y);
private:
uint* m_table;
};
#endif

View File

@ -20,4 +20,5 @@
#include "ImageApplyUV.h"
#include "ImageApplySplit.h"
#include "ImageApplyFadeBackGroundColor.h"
#include "ImageApplyColorCastCorrect.h"
#endif

Binary file not shown.