各种函数二次封装(持续更新)

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;
}

 

你可能感兴趣的:(OpenCV)