You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

363 lines
7.7 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "stdafx.h"
#include "stdafx.h"
#include "OpencvImgShell.h"
#include "IntensityContrastDefinationControl.h"
#include "IntensityControl.h"
#include "ContrastControl.h"
#include "DefinitionControl.h"
// 通用情报结构体亮度对比度清晰度控制
BOOL QBStru_ICD_Control(QBStru *qbData, int Idegree, int Cdegree, int Ddegree, BOOL bSrcFirst)
{
// 空值判断
if (qbData == NULL)
{
return FALSE;
}
// 图像数据无效直接返回false
if (qbData->imgValid == 0)
{
return FALSE;
}
// 优先处理srcImg
if (bSrcFirst == TRUE)
{
if (qbData->image.srcImg.buff != NULL &&
qbData->image.srcImg.ImgWidth > 0 && // srcImg 宽度验证
qbData->image.srcImg.ImgHeight > 0 && // srcImg 高度验证
(qbData->image.srcImg.bitcount == 24 || qbData->image.srcImg.bitcount == 8))
{
qbData->image.dstImg.ImgWidth = qbData->image.srcImg.ImgWidth;
qbData->image.dstImg.ImgHeight = qbData->image.srcImg.ImgHeight;
qbData->image.dstImg.bitcount = qbData->image.srcImg.bitcount;
// 步长:每行像素所占字节数
int lineByte = (qbData->image.dstImg.ImgWidth * qbData->image.dstImg.bitcount / 8);
// 位图数据缓冲区的大小,即图像大小
int imgBufSize = qbData->image.dstImg.ImgHeight * lineByte;
if (qbData->image.dstImg.buff != NULL)
{
delete [] qbData->image.dstImg.buff;
qbData->image.dstImg.buff = NULL;
}
qbData->image.dstImg.buff = new unsigned char[imgBufSize];
return ImgStru_ICD_Control(&qbData->image.srcImg, &qbData->image.dstImg, Idegree, Cdegree, Ddegree);
}
else
if (qbData->image.dstImg.buff != NULL &&
qbData->image.dstImg.ImgWidth > 0 && // dstImg 宽度验证
qbData->image.dstImg.ImgHeight > 0 && // dstImg 高度验证
(qbData->image.dstImg.bitcount == 24 || qbData->image.dstImg.bitcount == 8))
{
// 输入dstImg输出dstImg
return ImgStru_ICD_Control(&qbData->image.dstImg, &qbData->image.dstImg, Idegree, Cdegree, Ddegree);
}
else // srcImg dstImg均无效
{
return FALSE;
}
}
else
{
// 先看dstImg是否有效
if (qbData->image.dstImg.buff != NULL &&
qbData->image.dstImg.ImgWidth > 0 && // dstImg 宽度验证
qbData->image.dstImg.ImgHeight > 0 && // dstImg 高度验证
(qbData->image.dstImg.bitcount == 24 || qbData->image.dstImg.bitcount == 8))
{
return ImgStru_ICD_Control(&qbData->image.dstImg, &qbData->image.dstImg, Idegree, Cdegree, Ddegree);
}else
if (qbData->image.srcImg.buff != NULL &&
qbData->image.srcImg.ImgWidth > 0 && // srcImg 宽度验证
qbData->image.srcImg.ImgHeight > 0 && // srcImg 高度验证
(qbData->image.srcImg.bitcount == 24 || qbData->image.srcImg.bitcount == 8))
{
qbData->image.dstImg.ImgWidth = qbData->image.srcImg.ImgWidth;
qbData->image.dstImg.ImgHeight = qbData->image.srcImg.ImgHeight;
qbData->image.dstImg.bitcount = qbData->image.srcImg.bitcount;
// 步长:每行像素所占字节数
int lineByte = (qbData->image.dstImg.ImgWidth * qbData->image.dstImg.bitcount / 8);
// 位图数据缓冲区的大小,即图像大小
int imgBufSize = qbData->image.dstImg.ImgHeight * lineByte;
qbData->image.dstImg.buff = new unsigned char[imgBufSize];
return ImgStru_ICD_Control(&qbData->image.srcImg, &qbData->image.dstImg, Idegree, Cdegree, Ddegree);
}
else // 情报结构体srcImg 和 dstImg 均无效
{
return FALSE;
}
}
return TRUE;
}
// ImgStru结构下的图像亮度对比度清晰度控制
//功能:图像亮度对比度清晰度控制
BOOL ImgStru_ICD_Control(ImgStru* src, ImgStru* dst, int Idegree, int Cdegree, int Ddegree)
{
// src dst 有效性验证
if (src == NULL || dst ==NULL ||
src->ImgWidth <=0 ||
src->ImgHeight <= 0 ||
src->bitcount <= 0 ||
src->buff == NULL)
{
return FALSE;
}
if(src->bitcount != 8 && src->bitcount != 24)
{
return FALSE;
}
// 属性复制
dst->ImgWidth = src->ImgWidth;
dst->ImgHeight = src->ImgHeight;
dst->bitcount = src->bitcount;
dst->BoundingBox = src->BoundingBox;
// 构建输入、输出图像
IplImage* src_Img = NULL;
src_Img = cvCreateImage(cvSize(src->ImgWidth, src->ImgHeight), 8, src->bitcount/8);
// 步长每行像素所占字节数必须扩展成4的倍数
int lineByte = (src->ImgWidth * src->bitcount / 8 + 3) / 4 * 4;
// 位图数据缓冲区的大小,即图像大小
unsigned int imgBufSize = static_cast<unsigned int>(src->ImgHeight * lineByte);
if (src_Img != NULL)
{
// 图像数据复制
int realLineByte = (src->ImgWidth * src->bitcount / 8);
if (realLineByte == lineByte)
{
memcpy(src_Img->imageData, src->buff, imgBufSize);
}
else
{
for (int i = 0; i < src->ImgHeight; i++)
{
memcpy(src_Img->imageData + i * lineByte, src->buff + i * realLineByte, realLineByte);
}
}
}
else
{
return FALSE;
}
IplImage* dst_Img = NULL;
dst_Img = cvCreateImage(cvSize(dst->ImgWidth, dst->ImgHeight), 8, dst->bitcount/8);
if (dst_Img == NULL)
{
cvReleaseImage(&src_Img);
src_Img = NULL;
return FALSE;
}
SAFE_DELETE_ARRAY(dst->buff);
dst->buff = NULL;
dst->buff = new unsigned char[imgBufSize];
if (dst->buff == NULL)
{
cvReleaseImage(&src_Img);
src_Img = NULL;
cvReleaseImage(&dst_Img);
dst_Img = NULL;
return FALSE;
}
// 调用IplImageICDControl算法实现亮度对比度清晰度控制
if (IplImage_ICD_Control(src_Img, dst_Img, Idegree, Cdegree, Ddegree) == TRUE)
{
cvReleaseImage(&src_Img);
src_Img = NULL;
// 数据dst_Img->imageData 拷贝到 dst->buff
memcpy(dst->buff, dst_Img->imageData, imgBufSize);
cvReleaseImage(&dst_Img);
dst_Img = NULL;
}
else
{
cvReleaseImage(&src_Img);
src_Img = NULL;
cvReleaseImage(&dst_Img);
dst_Img = NULL;
return FALSE;
}
return TRUE;
}
// OpenCV结构下的图像亮度对比度清晰度控制
BOOL IplImage_ICD_Control(IplImage* src, IplImage* dst, int Idegree, int Cdegree, int Ddegree)
{
BOOL ret = FALSE;
// 亮度控制程度 判断和裁断
if(Idegree < 0)
{
Idegree = 0;
}
if(Idegree > 20)
{
Idegree = 20;
}
// 对比度控制程度 判断和裁断
if(Cdegree < 0)
{
Cdegree = 0;
}
if(Cdegree > 20)
{
Cdegree = 20;
}
// 清晰度 判断和裁断
if(Ddegree < 0)
{
Ddegree = 0;
}
if(Ddegree > 20)
{
Ddegree = 20;
}
// 排列组合
int way = 0;
if (Idegree == 10 && Cdegree == 10 && Ddegree == 10) // 000
{
way = 0;
}
else if (Idegree == 10 && Cdegree == 10 && Ddegree != 10) // 001
{
way = 1;
}
else if (Idegree == 10 && Cdegree != 10 && Ddegree == 10) // 010
{
way = 2;
}
else if (Idegree == 10 && Cdegree != 10 && Ddegree != 10) // 011
{
way = 3;
}
else if (Idegree != 10 && Cdegree == 10 && Ddegree == 10) // 100
{
way = 4;
}
else if (Idegree != 10 && Cdegree == 10 && Ddegree != 10) // 101
{
way = 5;
}
else if (Idegree != 10 && Cdegree != 10 && Ddegree == 10) // 110
{
way = 6;
}
else if (Idegree != 10 && Cdegree != 10 && Ddegree != 10) // 111
{
way = 7;
}
else
{
way = 8;
}
switch(way)
{
case 0:
cvCopy(src, dst);
ret = TRUE;
break;
case 1: // 只调节清晰度
ret = IplImageDefinitionControl(src, dst, Ddegree);
break;
case 2: // 只调节对比度
ret = IplImageContrastControl(src, dst, Cdegree);
break;
case 3:// 对比度 + 清晰度
if (IplImageContrastControl(src, dst, Cdegree))
{
cvCopy(dst, src);
ret = IplImageDefinitionControl(src, dst, Ddegree);
}
break;
case 4: // 只调节亮度
ret = IplImageIntensityControl(src, dst, Idegree);
break;
case 5: // 亮度 + 清晰度
if (IplImageIntensityControl(src, dst, Idegree))
{
cvCopy(dst, src);
ret = IplImageDefinitionControl(src, dst, Ddegree);
}
break;
case 6: // 亮度 + 对比度
if (IplImageIntensityControl(src, dst, Idegree))
{
cvCopy(dst, src);
ret = IplImageContrastControl(src, dst, Cdegree);
}
break;
case 7: // 亮度 + 对比度 + 清晰度
if (IplImageIntensityControl(src, dst, Idegree))
{
if (IplImageContrastControl(dst, src, Cdegree))
{
ret = IplImageDefinitionControl(src, dst, Ddegree);
}
}
break;
default:
break;
}
return ret;
}