一、獲取本地時間並格式化
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;
}
截圖如下: