#include #include #include #include #include "MSRegionSurveilance.h" #include "highgui.h" #include "cv.h" #include "RegionAssist.h" #include "time_debug.h" #include using namespace std; //using namespace cv; void imag_ana_1channels(); void imag_ana_3channels(); int main() { imag_ana_1channels(); //imag_ana_3channels(); system("pause"); } void imag_ana_3channels() { //AlarmInfo 1进入禁区 2离开禁区 3单向越界 4双向越界 5徘徊 6丢包 int numROI = 1; debug_time_t stime, etime; RegionInfo* pRegionInfo = new RegionInfo[numROI]; int LeftPointX = 1050; int LeftPointY = 450; int RightPointX = 1400; int RightPointY = 600; // 进入禁区 pRegionInfo[0].AlarmInfo = 1; pRegionInfo[0].nPointNum = 4; pRegionInfo[0].pROI[0].x = LeftPointX; pRegionInfo[0].pROI[0].y = LeftPointY; pRegionInfo[0].pROI[1].x = RightPointX; pRegionInfo[0].pROI[1].y = LeftPointY; pRegionInfo[0].pROI[2].x = RightPointX; pRegionInfo[0].pROI[2].y = RightPointY; pRegionInfo[0].pROI[3].x = LeftPointX; pRegionInfo[0].pROI[3].y = RightPointY; //pRegionInfo[0].AlarmInfo = 1; //pRegionInfo[0].nPointNum = 4; //pRegionInfo[0].pROI[0].x = LeftPointX/*226*/; //pRegionInfo[0].pROI[0].y = LeftPointY; //pRegionInfo[0].pROI[1].x = RightPointX/*223*/; //pRegionInfo[0].pROI[1].y = LeftPointY; //pRegionInfo[0].pROI[2].x = LeftPointX/*223*/; //pRegionInfo[0].pROI[2].y = RightPointY; //pRegionInfo[0].pROI[3].x = RightPointX/*223*/; //pRegionInfo[0].pROI[3].y = RightPointY; //pRegionInfo[0].dirPoint.x = 200;//用于定义方向的点 位于合法方向指向的一侧 //pRegionInfo[0].dirPoint.y = 109; // 定义 MS_RegionSurveillance MS1; IRegionSurveillance* test = MS1.GetMS_RS(); if (!test) { printf("model initial failed"); exit(0); } CvCapture* video1 = cvCaptureFromFile("../../data/test1.mp4"); // 用opencv函数读取视频的一帧 IplImage * src = cvQueryFrame(video1); IplImage * srcscale = cvCreateImage(cvSize(src->width, src->height), 8, 3); cvResize(src, srcscale); // 获得图像信息 int width = srcscale->width; int height = srcscale->height; int widthstep = srcscale->widthStep; int nChannel = srcscale->nChannels; int frameCount = 0; // 处理的图像序号 MS_ObjectInfo *ObjInfo = NULL; // 结果结构体 int ObjCount; int error_flag; long total_t = 0; // 循环处理视频的每一帧 while (src) { src = cvQueryFrame(video1); if (!src) break; cvResize(src, srcscale); // 如果当前处理的是第一帧,则要进行初始化 if (frameCount == 0) { error_flag = test->RSinit(width, height, widthstep, (unsigned char*)(srcscale->imageData), nChannel, 3, 0, 10, 1000000); if (error_flag == 0) { cout << "设置有问题!!!" << endl; return; } error_flag = test->RSRegion(numROI, pRegionInfo, false); if (error_flag == 0) { cout << "区域设置有问题!!!" << endl; return; } } GetTime(&stime); // 智能分析 test->RSDetect((unsigned char*)(srcscale->imageData), pRegionInfo); GetTime(&etime); total_t += CalcTimeDiff(&stime, &etime); //printf("RSDetect %d:%ld fps\n", frameCount, cost_t); // 获取智能分析结果 ObjCount = test->getObjectNum(); ObjInfo = new MS_ObjectInfo[ObjCount]; test->getObjectInfo(ObjCount, ObjInfo); printf("alram:\n"); for (int i = 0; i < ObjCount; i++) { if (ObjInfo[i].pbAlarmType[0]) { switch (ObjInfo[i].pbAlarmType[0]) { case 1: printf("obj %d: 进入禁区\n", ObjInfo[i].UniqueID); break; case 2: printf("obj %d: 离开禁区\n", ObjInfo[i].UniqueID); break; case 3: printf("obj %d: 单向越界\n", ObjInfo[i].UniqueID); break; case 4: printf("obj %d: 双向越界\n", ObjInfo[i].UniqueID); break; case 5: printf("obj %d: 徘徊\n", ObjInfo[i].UniqueID); break; case 6: printf("obj %d: 丢包\n", ObjInfo[i].UniqueID); break; } } } cvRectangle(srcscale, cvPoint(LeftPointX, LeftPointY), cvPoint(RightPointX, RightPointY), cvScalar(0, 0, 0)); // 轨迹描绘 Trajectory((unsigned char*)(srcscale->imageData), ObjInfo, ObjCount, width, height, widthstep); // 目标框描绘 ExternalRectangle((unsigned char*)(srcscale->imageData), ObjInfo, ObjCount, widthstep, numROI); //画出警报区域 //disp area 1 /*for (int i = 0; i < numROI; i++) { cvLine(srcscale, cvPoint(pRegionInfo[i].pROI[0].x, pRegionInfo[i].pROI[0].y), cvPoint(pRegionInfo[i].pROI[1].x, pRegionInfo[i].pROI[1].y), cvScalar(255, 0, 255), 1); //获取箭头端点坐标 if (pRegionInfo[i].AlarmInfo == 3) { cv::Point pStart, pEnd;//by zl pStart.x = pRegionInfo[i].ArrowStartPoint.x; pStart.y = pRegionInfo[i].ArrowStartPoint.y; pEnd.x = pRegionInfo[i].ArrowEndPoint.x; pEnd.y = pRegionInfo[i].ArrowEndPoint.y; DrawArrow(srcscale, pStart, pEnd, 15, 30);//调用绘制箭头函数 //显示dirPoint cv::Point pt1; pt1.x = pRegionInfo[i].dirPoint.x; pt1.y = pRegionInfo[i].dirPoint.y; cvLine(srcscale, pt1, pt1, cvScalar(255, 0, 255), 3); } // }*/ ++frameCount; // 图像显示 cvShowImage("3channels", srcscale); cvWaitKey(1); delete[] ObjInfo; } //循环处理结束 long aver_t = total_t / frameCount; printf("aver time:%ld us", aver_t); delete[] pRegionInfo; test->RSrelease(); MS1.Destroy(); cvReleaseCapture(&video1); cvReleaseImage(&srcscale); } void imag_ana_1channels() { //AlarmInfo 1进入禁区 2离开禁区 3单向越界 4双向越界 5徘徊 6丢包 int numROI = 1; debug_time_t stime, etime; RegionInfo* pRegionInfo = new RegionInfo[numROI]; int LeftPointX = 1050; int LeftPointY = 450; int RightPointX = 1400; int RightPointY = 600; // 进入禁区 int index = 0; pRegionInfo[index].AlarmInfo = 1; pRegionInfo[index].nPointNum = 4; pRegionInfo[index].pROI[0].x = LeftPointX; pRegionInfo[index].pROI[0].y = LeftPointY; pRegionInfo[index].pROI[1].x = RightPointX; pRegionInfo[index].pROI[1].y = LeftPointY; pRegionInfo[index].pROI[2].x = RightPointX; pRegionInfo[index].pROI[2].y = RightPointY; pRegionInfo[index].pROI[3].x = LeftPointX; pRegionInfo[index].pROI[3].y = RightPointY; index = 0; //离开禁区 pRegionInfo[index].AlarmInfo = 2; pRegionInfo[index].nPointNum = 4; pRegionInfo[index].pROI[0].x = LeftPointX; pRegionInfo[index].pROI[0].y = LeftPointY; pRegionInfo[index].pROI[1].x = RightPointX; pRegionInfo[index].pROI[1].y = LeftPointY; pRegionInfo[index].pROI[2].x = RightPointX; pRegionInfo[index].pROI[2].y = RightPointY; pRegionInfo[index].pROI[3].x = LeftPointX; pRegionInfo[index].pROI[3].y = RightPointY; // 定义 MS_RegionSurveillance MS1; IRegionSurveillance* test = MS1.GetMS_RS(); if (!test) { printf("model initial failed"); exit(0); } CvCapture* video1 = cvCaptureFromFile("../../data/test1.mp4"); // 用opencv函数读取视频的一帧 IplImage * src = cvQueryFrame(video1); IplImage * srcscale = cvCreateImage(cvSize(src->width, src->height), 8, 3); //用于缩放 当前先不缩放 IplImage * gray = cvCreateImage(cvSize(srcscale->width, srcscale->height), 8, 1); cvResize(src, srcscale); cvCvtColor(srcscale, gray, CV_RGB2GRAY); //cv::Mat saveImg = cv::cvarrToMat(src, true); //cv::rectangle(saveImg, cv::Rect(1000, 450, 1450-1000, 600-450), cv::Scalar(255, 255, 0), 2); //cv::imwrite("img.jpg", saveImg); //cv::imshow("image", saveImg); //cv::waitKey(0); CvVideoWriter *writer = cvCreateVideoWriter("result_2019_9_23.avi", CV_FOURCC('M', 'J', 'P', 'G'), 30, cvSize(srcscale->width, srcscale->height)); int frameCount = 0; // 处理的图像序号 MS_ObjectInfo *ObjInfo = NULL; // 结果结构体 int ObjCount; int error_flag; long total_t = 0; printf("width = %d height = %d\n", gray->width, gray->height); // 循环处理视频的每一帧 while (src) { src = cvQueryFrame(video1); if (!src) break; cvResize(src, srcscale); cvCvtColor(srcscale, gray, CV_RGB2GRAY); // 如果当前处理的是第一帧,则要进行初始化 if (frameCount == 0) { error_flag = test->RSinit(gray->width, gray->height, gray->widthStep, (unsigned char*)(gray->imageData), gray->nChannels, 1, 0, 10, 1000000); if (error_flag == 0) { cout << "设置有问题!!!" << endl; return; } error_flag = test->RSRegion(numROI, pRegionInfo, false); if (error_flag == 0) { cout << "区域设置有问题!!!" << endl; return; } } GetTime(&stime); // 智能分析 test->RSDetect((unsigned char*)(gray->imageData), pRegionInfo); GetTime(&etime); total_t += CalcTimeDiff(&stime, &etime); printf("detect time:%ld us\n", CalcTimeDiff(&stime, &etime)); // 获取智能分析结果 ObjCount = test->getObjectNum(); ObjInfo = new MS_ObjectInfo[ObjCount]; test->getObjectInfo(ObjCount, ObjInfo); //报警区域 cvRectangle(srcscale, cvPoint(LeftPointX, LeftPointY), cvPoint(RightPointX, RightPointY), cvScalar(0, 0, 0)); // 轨迹描绘 Trajectory((unsigned char*)(srcscale->imageData), ObjInfo, ObjCount, srcscale->width, srcscale->height, srcscale->widthStep); // 目标框描绘 ExternalRectangle((unsigned char*)(srcscale->imageData), ObjInfo, ObjCount, srcscale->widthStep, numROI); for (int i = 0; i < ObjCount; i++) { for (int j = 0; j < numROI; j++) { if (ObjInfo[i].pbAlarmType[j]) { switch (ObjInfo[i].pbAlarmType[j]) { case 1: printf("obj %d: 进入禁区\n", ObjInfo[i].UniqueID); break; case 2: printf("obj %d: 离开禁区\n", ObjInfo[i].UniqueID); break; case 3: printf("obj %d: 单向越界\n", ObjInfo[i].UniqueID); break; case 4: printf("obj %d: 双向越界\n", ObjInfo[i].UniqueID); break; case 5: printf("obj %d: 徘徊\n", ObjInfo[i].UniqueID); break; case 6: printf("obj %d: 丢包\n", ObjInfo[i].UniqueID); break; } } } } ++frameCount; cvWriteFrame(writer, srcscale); // 图像显示 cvShowImage("1channels", srcscale); cvWaitKey(1); delete[] ObjInfo; } //循环处理结束 long aver_t = total_t / frameCount; printf("aver time:%ld us", aver_t); cvReleaseVideoWriter(&writer); delete[] pRegionInfo; test->RSrelease(); MS1.Destroy(); cvReleaseCapture(&video1); cvReleaseImage(&srcscale); cvReleaseImage(&gray); }