1.获取程序运行路径(C++)
1.1Win32版
string GetHomeFolder()
{
//请将字符集设置为多字节字符集,否则会报错
string path = _pgmptr;
size_t pos = path.rfind('\\');
path = path.substr(0, pos);
return path + "\\";
}
1.2MFC版
CString GetHomeFolder()
{
//程序运行路径
CString path;
GetModuleFileName(NULL, path.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
path.ReleaseBuffer();
int pos = path.ReverseFind('\\');
path = path.Left(pos);
return path + "\\";
}
1.3 dll版
std::string GetAppFilePath()
{
std::string szPath;
char szBuff[MAX_PATH] = { 0 };
HMODULE hModuleInstance = _AtlBaseModule.GetModuleInstance();
GetModuleFileNameA(hModuleInstance, szBuff, MAX_PATH);
szPath = szBuff;
szPath = szPath.substr(0, szPath.rfind('\\'));
return szPath+"\\";
}
2.获取平均灰度值(OpenCV)
2.1无mask版本
double GetAvgValue(Mat &Src)
{
double val=0.0;
Mat temp = Src.clone();
IplImage imgTmp = temp;
IplImage *input = cvCloneImage(&imgTmp);
CvScalar bColor = cvAvg(input);
//Gray=R*0.299+G*0.587+B*0.114
val = bColor.val[2] * 0.299 + bColor.val[1] * 0.587 + bColor.val[0] * 0.114;
cvReleaseImage(&input);
return val;
}
3.绘制多边形轮廓(OpenCV)
3.1数组
bool DrawPolylines(Mat &Src, Point *pt, int size)
{
if (Src.empty())return false;
Point **rPoints = new Point *[1];//[1][FACE_SECTION_DOWN];
rPoints[0] = new Point[size];
int npt[] = { size };
for (int i = 0; i < size; i++)
{
rPoints[0][i] = pt[i] ;
}
const Point* ppt[1] = { rPoints[0] };
//cv::fillPoly(Src, ppt,npt,1,Scalar(10,40,230),0);
cv::polylines(Src, ppt, npt, 1,true, Scalar(0, 0, 0));
delete[] rPoints[0];
delete[] rPoints;
return true;
}
3.2 vector
bool DrawPolylines(Mat &Src, std::vector Pts)
{
if (Src.empty())return false;
if (Pts.size() == 0)return false;
int size = Pts.size();
Point **rPoints = new Point *[1];//[1][FACE_SECTION_DOWN];
rPoints[0] = new Point[size];
int npt[] = { size };
for (int i = 0; i < size; i++)
{
rPoints[0][i] = Pts.at(i);
}
const Point* ppt[1] = { rPoints[0] };
//cv::fillPoly(Src, ppt,npt,1,Scalar(10,40,230),0);
cv::polylines(Src, ppt, npt, 1, true, Scalar(0, 0, 0));
delete[] rPoints[0];
delete[] rPoints;
return true;
}
4.图像对比度调整(OpenCV)
4.1亮度增强和小幅度增加对比度
bool ChnageLight(Mat &Src, Mat &Dst ,float alpha, float beta)
{
if (Src.empty() || Src.channels() != 3)
{
return false;
}
int height = Src.rows;
int width = Src.cols;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
Dst.at(i, j)[0] = cv::saturate_cast(alpha*(Src.at(i, j)[0]) + beta);
Dst.at(i, j)[1] = cv::saturate_cast(alpha*(Src.at(i, j)[1]) + beta);
Dst.at(i, j)[2] = cv::saturate_cast(alpha*(Src.at(i, j)[2]) + beta);
}
}
return true;
}
4.2 直方图均衡(OpenCV)
bool SetEqualizeHist(cv::Mat &Src,cv::Mat &Dst)
{
cv::Mat imageRGB[3];
cv::split(Src, imageRGB);
for (int i = 0; i < 3; i++)
{
cv::equalizeHist(imageRGB[i], imageRGB[i]);
}
cv::merge(imageRGB, 3, Dst);
}
5.简单的渐变色生成(OpenCV)
Mat CFacialBeauty::CreateMask(cv::Scalar bClolr )
{
//创建彩色图像
Mat bMat(600,600,CV_8UC3);
std::vector bMat_channels;
cv::split(bMat, bMat_channels);
//简单渐变
for (int i = 0; i < bMat.rows ; i++)
{
for (int j = 0; j < bMat.cols ; j++)
{
bMat_channels[0].at(i, j) = cv::saturate_cast(i* 0.15 + bClolr.val[0]);
bMat_channels[1].at(i, j) = cv::saturate_cast(i* 0.26 + bClolr.val[1]);
bMat_channels[2].at(i, j) = cv::saturate_cast(i* 0.07 + bClolr.val[2]);
}
}
cv::merge(bMat_channels, bMat);
return bMat;
}
6.c++判断文件是否存在(C++)
bool fileExist(string path)
{
ifstream fin(path);
if (!fin)
{
return false;
}
return true;
}
7.绘制空心圆(Flash AS3)
private function DrawCircle(pt:Point,r:int):void
{
this.graphics.moveTo(r+pt.x,pt.y);//
this.graphics.lineStyle(1.5,0xff0000);//设置线形(线条粗细,颜色)
for (var radian:Number=0.01; radian<2*Math.PI; radian+=0.01)
{
var diP:Point = Point.polar(r,radian);//极坐标转笛卡尔坐标。
var dx:Number = pt.x+diP.x;
var dy:Number = pt.y+diP.y;
this.graphics.lineTo(dx,dy);//画到某个点的坐标。
}
}
private function DrawCircle1(pt:Point,r:int):void
{
circle = new Shape();
circle.graphics.lineStyle(1.5,0xff0000);//设置线形(线条粗细,颜色)
circle.graphics.drawCircle(pt.x, pt.y, r); //x,y,半径
stage.addChild(circle);
}
8.格式化当前时间(Flash AS3)
function GetDate():String{
//创建新的日期对象,用来获取现在的时间
var nowdate:Date = new Date();
//获取当前的年份
var year:Number = nowdate.getFullYear();
//获取当前的月份,因为数组从0开始用0-11表示1-12月,所以要加1
var month:Number = nowdate.getMonth()+1;
//获取当前日
var date:Number = nowdate.getDate();
//获取当前小时
var hour:Number = nowdate.getHours();
//获取当前的分钟
var minute:Number = nowdate.getMinutes();
//获取当前的秒钟
var second:Number = nowdate.getSeconds();
var Name:String=year.toString();
Name+=month>10?month.toString():"0"+month.toString();
Name+=date>10?date.toString():"0"+date.toString();
Name+=hour>10?hour.toString():"0"+hour.toString();
Name+=minute>10?minute.toString():"0"+minute.toString();
Name+=second>10?second.toString():"0"+second.toString();
return Name;
}
9.让文件消失(C++/MFC)
//文件同时拥有系统和隐藏属性就会消失(完全看不见那种,只有cmd显示全部文件,或者一些查询工具才能发现);
//Path:文件完整路径,包括名字和格式
SetFileAttributes(Path, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN);
10.网络连接判断(C++)
//是否连接互联网
bool IsOnline()
{
DWORD flag;
if (InternetGetConnectedState(&flag, 0) == TRUE)
{
return true;
}
return false;
}
11.获取时间
CTime t = CTime::GetCurrentTime();
CString tt = t.Format("%Y%m%d%H%M%S");
12.数据以16进制发送
void HexStringFilter(CString &str)
{
BOOL bOK;
for (int i = 0; i= '0') && (str.GetAt(i) <= '9')) ||
((str.GetAt(i) >= 'A') && (str.GetAt(i) <= 'F')) ||
((str.GetAt(i) >= 'a') && (str.GetAt(i) <= 'f'));
if (!bOK)
str.Delete(i);
else i++;
}
}
char CombineHexChar(char CharH, char CharL)
{
char result;
CString temp;
if (CharH >= '0'&&CharH <= '9') result = (CharH - '0');
else if (CharH >= 'a'&&CharH <= 'f') result = (CharH - 'a' + 10);
else if (CharH >= 'A'&&CharH <= 'F') result = (CharH - 'A' + 10);
else result = 0;
result <<= 4;
if (CharL >= '0'&&CharL <= '9') result += (CharL - '0');
else if (CharL >= 'a'&&CharL <= 'f') result += (CharL - 'a' + 10);
else if (CharL >= 'A'&&CharL <= 'F') result += (CharL - 'A' + 10);
else result += 0;
return result;
}
//将数据转换成16进制数据发送,一般用于串口信息
CString ChangeCharstr2Hexstr(CString Charstr)
{
CString Hexstr = _T("");
Charstr.MakeUpper();
HexStringFilter(Charstr);
int Length = Charstr.GetLength();
if (Length % 2)
Charstr.Delete(Length - 1);
Length = Charstr.GetLength();
for (int i = 0; i
13.单个Char数据以16进制方式显示
CString DevideHexChar(char HexChar)
{
CString result = _T("");
int temp = (HexChar & 0xF0) >> 4;
if (temp < 10)
{
result += (char)(temp + '0');
}
else
{
result += (char)(temp + 'A' - 10);
}
temp = HexChar & 0x0F;
if (temp < 10)
{
result += (char)(temp + '0');
}
else
{
result += (char)(temp + 'A' - 10);
}
return result;
}
14.Socket断线检测
//https://blog.csdn.net/sjin_1314/article/details/8897588?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
bool SocketCheck(SOCKET sock)
{
//当使用 select()函数测试一个socket是否可读时,如果select()函数返回值为1,
//且使用recv()函数读取的数据长度为0 时,就说明该socket已经断开
char buff[20];
memset(buff, NULL, sizeof(char) * 20);
struct timeval timeout = { 1, 0 };
fd_set rdfs;
FD_ZERO(&rdfs);
FD_SET(sock, &rdfs);
int re= select(sock + 1, &rdfs, NULL, NULL, &timeout);
if (re > 0)
{
int recvLen = recv(sock, buff, sizeof(buff), 0);
if (recvLen > 0)
{
//printf("socket connected\n");
return true;
}
else if (recvLen < 0)
{
if (errno == EINTR)
{
//printf("socket connected\n");
return true;
}
else
{
//printf("socket disconnected! connect again!\n");
return false;
}
}
else if (recvLen == 0)
{
//printf("socket disconnected!connect again\n");
return false;
}
}
else if (re == 0)
{
//time out
//printf("socket connected\n");
return true;
}
else if (re < 0)
{
if (errno == EINTR)
{
//printf("socket connected\n");
return true;
}
else
{
//printf("socket disconnected ! connect again!\n");
return false;
}
}
}
15.十进制字符串转16进制字符串
//#include
//#include
std::string dec2hex(int i, int width)
{
std::stringstream ioss; //定义字符串流百
std::string s_temp; //存放转化后字符
ioss << std::hex << i; //以十六制形度式输出问
ioss >> s_temp;
std::string s(width - s_temp.size(), '0'); //补0
s += s_temp; //合并
return s;
}