各種関数の二次パッケージング(継続更新)

10358 ワード

1.プログラム実行パスの取得(C++)
1.1 Win 32版
string GetHomeFolder()
{
//              ,     
	string path = _pgmptr;
	size_t pos = path.rfind('\\');
	path = path.substr(0, pos);
	return path + "\\";
}

1.2 MFC版
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<:vec3b>(i, j)[0] = cv::saturate_cast(alpha*(Src.at<:vec3b>(i, j)[0]) + beta);
			Dst.at<:vec3b>(i, j)[1] = cv::saturate_cast(alpha*(Src.at<:vec3b>(i, j)[1]) + beta);
			Dst.at<:vec3b>(i, j)[2] = cv::saturate_cast(alpha*(Src.at<:vec3b>(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<:mat> 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 AS 3)
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 AS 3)
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
"); return true; } else if (recvLen < 0) { if (errno == EINTR) { //printf("socket connected
"); return true; } else { //printf("socket disconnected! connect again!
"); return false; } } else if (recvLen == 0) { //printf("socket disconnected!connect again
"); return false; } } else if (re == 0) { //time out //printf("socket connected
"); return true; } else if (re < 0) { if (errno == EINTR) { //printf("socket connected
"); return true; } else { //printf("socket disconnected ! connect again!
"); return false; } } }

15.10進文字列から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;
}