C++以及opencv小功能集

一、获取本地时间并格式化

1.1 获取秒级

void gettime()
{
	struct tm t;              //tm结构指针
	time_t now;               //声明time_t类型变量
	time(&now);               //获取系统日期和时间
	localtime_s(&t, &now);    //获取当地日期和时间

	//格式化输出本地时间
	printf("年:%d\n", t.tm_year + 1900);
	printf("月:%d\n", t.tm_mon + 1);
	printf("日:%d\n", t.tm_mday);
	printf("周:%d\n", t.tm_wday);
	printf("一年中:%d\n", t.tm_yday);
	printf("时:%d\n", t.tm_hour);
	printf("分:%d\n", t.tm_min);
	printf("秒:%d\n", t.tm_sec);
	printf("夏令时:%d\n", t.tm_isdst);

	string time_s = format("%d", t.tm_year + 1900) + "/" + format("%.2d", t.tm_mon + 1) + "/" + format("%.2d", t.tm_mday) + " " +
		format("%.2d", t.tm_hour) + ":" + format("%.2d", t.tm_min) + ":" + format("%.2d", t.tm_sec);
	cout << "格式:" <

结果如下:

C++以及opencv小功能集_第1张图片

 1.2 获取毫秒级

void getMillisecond() {
	long startTime = clock();
	Sleep(2000);
	long endTime = clock();
	cout << endTime - startTime << endl;
}

二、YUV420P转Mat等

2.1 YUV420P转Mat

其中inDataPtr->imgInform.dataPtr数据类型是:unsigned char *。下面是先将YUV转成单通道的Mat类型,注意高是原来的1.5倍;最后使用cvtColor将单通道的Mat类型转成BGR格式。

int len = inDataPtr->imgInform.width * inDataPtr->imgInform.height * 3 / 2;
cv::Mat yuvImg;
cv::Mat frame(inDataPtr->imgInform.height, inDataPtr->imgInform.width, CV_8UC3);
yuvImg.create(inDataPtr->imgInform.height * 3 / 2, inDataPtr->imgInform.width, CV_8UC1);
memcpy(yuvImg.data, inDataPtr->imgInform.dataPtr, len);
cv::cvtColor(yuvImg, frame, cv::COLOR_YUV2BGR_I420);
cv::imshow("ret",frame);
cv::waitKey(0);

2.2 unsigned char*转Mat

cv::Mat bgr(inDataPtr->imgInform.height, inDataPtr->imgInform.width, CV_8UC3);
int len = inDataPtr->imgInform.width * inDataPtr->imgInform.height * 3;
memcpy(rgb.data, inDataPtr->imgInform.dataPtr, len);
imshow("bgr", bgr);
waitKey(0);

三、获取鼠标左键点击图片坐标以及多边形Mask

#include 
#include 
#include 

using namespace std;
using namespace cv;

struct callbackP
{
	Mat src;
	vector srcTri;
};

void points2Mask(cv::Mat& src, std::vector mask_points) {

	std::vector> mask_area;
	mask_area.push_back(mask_points);

	polylines(src, mask_area, 1, cv::Scalar(0, 0, 0));
	fillPoly(src, mask_area, cv::Scalar(255, 255, 255));
}

void onMouse(int event, int x, int y, int flags, void *utsc)
{
	callbackP cp = *(callbackP*)utsc;  // 先转换类型,再取数据

	if (event == EVENT_LBUTTONUP)      // 响应鼠标左键事件
	{
		circle((*(callbackP*)utsc).src, cv::Point(x, y), 2, Scalar(255, 255, 255), 4);  //标记选中点
		imshow("wait ", (*(callbackP*)utsc).src);
		(*(callbackP*)utsc).srcTri.push_back(cv::Point(x, y));
		cout << "x:" << x << " " << "y:" << y << endl;
	}
}

vector getPoints(Mat img) {
	callbackP utsc;
	utsc.src = img.clone();
	namedWindow("src", WINDOW_AUTOSIZE);
	imshow("src", utsc.src);
	setMouseCallback("src", onMouse, (void*)&utsc);  //类型转换
	waitKey();
	destroyAllWindows();
	return utsc.srcTri;
}

int main(){
	Mat frame = cv::Mat::zeros(480, 640, CV_8UC1);
	vector points;
	points = getPoints(frame);   // 获取点集
	points2Mask(frame, points);  // 点集转Mask
	imshow("mask", frame);
	waitKey(0);
	destroyAllWindows();

	// 判断是否在封闭区域内
	points.clear();
	points = getPoints(frame);
	for(int i=0;i(points[i].y, points[i].x) == 255) {     // 在区域内
			cout << "True" << endl;
		}
		else {                                                      // 不在区域内
			cout << "False" << endl;
		}
	}
	int a;
	cin >> a;
}

截图如下:

C++以及opencv小功能集_第2张图片

 

你可能感兴趣的:(Cplusplus,opencv)