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 << "格式:" <<time_s << endl;

	std::string time_name = cv::format("%d", t.tm_year + 1900) + cv::format("%.2d", t.tm_mon + 1) + cv::format("%.2d", t.tm_mday) + "_" +
		cv::format("%.2d", t.tm_hour) + cv::format("%.2d", t.tm_min) + cv::format("%.2d", t.tm_sec);
	cout << "格式:" <<time_name << endl;
}

結果如下:

 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 <iostream>
#include <vector>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

struct callbackP
{
	Mat src;
	vector<cv::Point> srcTri;
};

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

	std::vector<std::vector<cv::Point>> 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<cv::Point> 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<cv::Point> 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.size();i++){
		if (frame.at<uchar>(points[i].y, points[i].x) == 255) {     // 在區域內
			cout << "True" << endl;
		}
		else {                                                      // 不在區域內
			cout << "False" << endl;
		}
	}
	int a;
	cin >> a;
}

截圖如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章