demo.cpp 5.76 KB
#include <stdio.h>
#include <iostream>
#include <time.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <windows.h>
#endif 


#include "highgui.h"
#include "cv.h"
#include <deque>
#include <opencv2/opencv.hpp>
#include "left_over_det.h"
#include <chrono>
#include <boost/thread.hpp>
#include "RegionAssist.h"

using namespace std;
using namespace cv;

void imag_ana_3channels();
void algorthim_thread1();
int main()
{
	//int test_count = 10;

	//while (test_count--)
	//{
	//	printf("begin test_count: %d\n", test_count);

	//	boost::thread thrd1(boost::bind(algorthim_thread1));
	//	boost::thread thrd2(boost::bind(algorthim_thread1));
	//	boost::thread thrd3(boost::bind(algorthim_thread1));
	//	boost::thread thrd4(boost::bind(algorthim_thread1));

	//	thrd1.join();
	//	thrd2.join();
	//	thrd3.join();
	//	thrd4.join();

	//	printf("finish\n");
	//}
	imag_ana_3channels();

	system("pause");
}

#include <cv.h>
#include <highgui.h>

void algorthim_thread1() {

	void *tools = nullptr;
	rs_param param;
	param.frame_num = 10;

	if (rs_init(&tools, param) != 0)
		cout << "hp_init ailed!" << endl;

	IplImage * src = cvLoadImage("./test.jpg");
	sy_img img;
	img.set_data(src->width, src->height, 3, (unsigned char*)src->imageData);

	rs_result res;
	rs_process(tools, img, &res);

	rs_release(&tools);

	printf("thread finish\n");
}



void imag_ana_3channels()
{
	//AlarmInfo 1进入禁区 2离开禁区 3单向越界 4双向越界 5徘徊 6丢包

	void *tools = nullptr;
	rs_param param;
	param.frame_num = 30;
	param.long_side = 1920;
	param.short_side = 1080;
	if (rs_init(&tools, param) != 0)
		cout << "hp_init ailed!" << endl;

	char imgpath[260];
	CvCapture* video1 = cvCaptureFromFile("D:\\ruijinVideo\\192.168.1.10_01_2020072911472348.mp4");
	// 用opencv函数读取视频的一帧
	IplImage * src = cvQueryFrame(video1);

	int long_side = (src->width > src->height ? src->width : src->height);
	int short_side = (src->width <= src->height ? src->width : src->height);
	double scale_l = (double)long_side / (double)param.long_side;
	double scale_s = (double)short_side / (double)param.short_side;
	double scale = (scale_l > scale_s ? scale_l : scale_s);
	scale = 1.0;
	int width = src->width / scale;
	int height = src->height / scale;
	//width = 1912;
	IplImage * srcscale = cvCreateImage(cvSize(width, height), 8, 3);	//用于缩放 当前先不缩放
	CvVideoWriter *writer = cvCreateVideoWriter("result_2019_9_23.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, cvSize(srcscale->width, srcscale->height));
	/************************************************/
	//int long_side = (srcscale->width > srcscale->height ? srcscale->width : srcscale->height);
	//int short_side = (srcscale->width <= srcscale->height ? srcscale->width : srcscale->height);
	//double scale_l = (double)long_side / (double)param.long_side;
	//double scale_s = (double)short_side / (double)param.short_side;
	//double scale = (scale_l > scale_s ? scale_l : scale_s);
	//scale = 1.6;	

	//int width = srcscale->width / scale;
	//int height = srcscale->height / scale;
	//CvVideoWriter *writer = cvCreateVideoWriter("result_2019_9_23.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, cvSize(width, height));
	//IplImage * srcscale1 = cvCreateImage(cvSize(width, height), 8, 3);	//用于缩放 当前先不缩放
	/***********************************************************************/
	cvResize(src, srcscale);
	while (src)
	{
		src = cvQueryFrame(video1);
		if (!src)
			break;
		cvResize(src, srcscale);
		sy_img syimg;
		syimg.set_data(srcscale->width, srcscale->height, srcscale->nChannels, (unsigned char *)srcscale->imageData);

		rs_result result{};
		rs_process(tools, syimg, &result);
		if (result.del_count != 0)
		{

				for (int i = 0; i < result.del_count; ++i)
				{
					printf("delete object id = %d\n", result.del_infos[i].unique_id);
				}
		}


		/********************************************/
		
		
		//cvResize(src, srcscale1);
		//ExternalRectangle((unsigned char*)(srcscale1->imageData), srcscale1->width, srcscale1->height, result.obj_infos, result.obj_count, srcscale1->widthStep, 1);
		
		/*****************************************************/
		ExternalRectangle((unsigned char*)(srcscale->imageData), srcscale->width, srcscale->height, result.obj_infos, result.obj_count, srcscale->widthStep, 1);
		CvFont font;
		cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 2, 8);
		//cvPutText(srcscale, "1Hello World !", cvPoint(80, 40), &font, cvScalar(255, 0, 0, 1));
		std::string str;
		std::string alarm;
		for (int i = 0; i < result.obj_count; i++)
		{
			for (int j = 0; j < 1; j++)
			{
				if (result.obj_infos[i].pb_alarm_type[j])
				{
					switch (result.obj_infos[i].pb_alarm_type[j])
					{
					case 1:
						printf("obj %d: 进入禁区\n", result.obj_infos[i].unique_id);
						str = " 有目标闯入禁区 ";
						break;
					case 2:
						printf("obj %d: 离开禁区\n", result.obj_infos[i].unique_id);
						str = " 有目标离开禁区 ";
						break;
					case 3:
						printf("obj %d: 单向越界\n", result.obj_infos[i].unique_id);
						str = " 有目标单向越界 ";
						break;
					case 4:
						printf("obj %d: 双向越界\n", result.obj_infos[i].unique_id);
						str = " 有目标越界 ";
						break;
					case 5:
						printf("obj %d: 徘徊\n", result.obj_infos[i].unique_id);
						str = " 有目标在禁区内徘徊 ";
						break;
					case 6:
						printf("obj %d: 丢包\n", result.obj_infos[i].unique_id);
						str = " 丢包 ";
						alarm += std::to_string(result.obj_infos[i].unique_id);
						alarm += " Packet loss";
						cvPutText(srcscale, alarm.c_str(), cvPoint(40, 40), &font, cvScalar(255, 0, 0, 1));
						break;
					default:
						break;
					}
				}
				else
				{
					;
				}
			}


		}
		cvWriteFrame(writer, srcscale);
		
		// 图像显示
		cvShowImage("1channels", srcscale);

		cvWaitKey(1);
	}
	rs_release(&tools);
	//cvReleaseImage(&srcscale1);
	//cvReleaseImage(&gray);
	cvReleaseCapture(&video1);
	cvReleaseImage(&srcscale);

}