tx-gxx-linux/device/gxx-linux/testimgproc/main.cpp

174 lines
4.9 KiB
C++
Raw Permalink Normal View History

2023-04-08 00:56:20 +00:00
#include <iostream>
#include <memory>
#include "cvimagex.h"
#include "opencv2/opencv.hpp"
#include <FreeImagePlus.h>
#include "StopWatch.h"
2023-05-02 01:50:55 +00:00
#include <iostream>
2023-04-08 00:56:20 +00:00
#include "iimageencode.h"
#include "imageencode.h"
2023-05-02 01:50:55 +00:00
std::vector<double> caculate(const std::vector<double>& points_x, const std::vector<double>& points_y)
{
int MaxElement = points_x.size() - 1;
//计算常数f
double f = points_y[0];
//求解
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];//得到各行中所在列最大元素
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;//让该行的所在列除以所在列的第一个元素目的是让首元素为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;//前后行数相减使下一行或者上一行的首元素为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 hsvCorrect_init(uint* table)
{
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> points_x, points_y, coefficient;
points_x = { 0, 80, 175, 255 };
points_y = { 12, 85, 175, 270 };
coefficient = caculate(points_x, points_y);
for (int j = 0; j < 256; j++)
table_data[j] = static_cast<int>(cv::max(0.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(table, mat_bgr32.data, mat_bgr32.total() * sizeof(uint));
}
void hsvCorrect(cv::Mat& image, uint* table)
{
if (image.channels() != 3)
return;
cv::Mat bgra;
cv::cvtColor(image, 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] = table[ptr[j] & 0x00ffffff];
}
cv::cvtColor(bgra, image, cv::COLOR_BGRA2BGR);
}
2023-04-08 00:56:20 +00:00
static std::string read_all_from(std::string path)
{
int t;
FILE* file = fopen(path.c_str(), "rb");
fseek(file, 0, SEEK_END);
t = ftell(file);
std::string buf(t, 0);
fseek(file, 0, SEEK_SET);
fread((void*)buf.c_str(), t, 1, file);
fclose(file);
return buf;
}
int main()
{
//std::string straa = read_all_from("/mnt/d/3.tif");
//fipMemoryIO mio((unsigned char*)straa.c_str(), straa.size());
//auto filet = mio.getFileType();
2023-05-02 01:50:55 +00:00
uint *table =new uint[256*256*256];
hsvCorrect_init(table);
for(int i =1;i<5;i++){
//std::string imgpath = "/home/img/Scan"+std::to_string(i)+".jpg";
std::string imgpath = "/home/scan_0016.jpg";
cv::Mat mat=cv::imread(imgpath,cv::IMREAD_COLOR);
StopWatch sw;
hsvCorrect(mat,table);
printf("\n hsvCorrect %f ",sw.elapsed_ms());
cv::imwrite("/home/Scan"+std::to_string(i)+"done.jpg",mat);
}
2023-05-02 01:50:55 +00:00
delete []table;
// ImageEncodePtr encoder(new BmpImageEncode());
// encoder->encode(mat);
2023-04-08 00:56:20 +00:00
return 0;
}