#include "ImageSaveCache.h" #include #include #include #include #include //std::ofstream osImage("D:\\vptImagelog.txt", std::ofstream::out | std::ofstream::trunc); void ImageSaveCache::show() { size_t count = 1; for (auto item = mp_key.begin(); item != mp_key.end(); ) { //osImage << std::unitbuf; //osImage << item->first.videoID << " " << item->first.objID << " : " << item->second.videoID << " " << item->second.objID << std::endl; auto unaryPred = [item](std::pair & item_key) { if (item_key.second == item->second) { return true; } else { return false; } }; ++item; if (item == mp_key.end()) break; if (find_if(item, mp_key.end(), unaryPred) == mp_key.end()) { ++count; continue; } } //osImage << " tital : " << mp_key.size() << " diff : " << count << std::endl; } //#include //std::ofstream os1("./mp_frameSize.txt", std::ofstream::out | std::ofstream::trunc); void ImageSaveCache::insert(const OBJ_KEY &snaphot_id, const FRAME_KEY & frame_id, const DxGPUFrame & frame) { //std::lock_guard l(tx); //os1 << std::unitbuf; auto iterK = mp_key.find(snaphot_id); if (iterK == mp_key.end()) { //os1 << mp_frame.size() << std::endl; auto unaryF = [&frame_id](std::pair & item_key) { if (item_key.first == frame_id) { return true; } else { return false; } }; auto iterF = std::find_if(mp_frame.begin(), mp_frame.end(), unaryF); if (iterF != mp_frame.end()) //如果该大图已保存,则直接添加该索引到索引map { mp_key.insert({ snaphot_id, frame_id }); } else //如果大图没保存,则新创建数据,并添加大图和索引 { auto iterFrame = mp_frame.begin(); for (; iterFrame != mp_frame.end(); ++iterFrame) { auto unaryPred = [iterFrame](std::pair & item_key) { if (item_key.second == iterFrame->first) { return true; } else { return false; } }; auto iterKey = std::find_if(mp_key.begin(), mp_key.end(), unaryPred); if (iterKey == mp_key.end() && iterFrame->second.width == frame.width && iterFrame->second.height == frame.height && iterFrame->second.size == frame.size) //如果该大图没保存,则先遍历大图vector,如果某一个大图数据,不被索引map所索引,那么该大图数据将被重新利用 { cudaError_t cudaStatus = cudaMemcpy(iterFrame->second.frame, frame.frame, IMG_CHANNELS * frame.size * frame.height * sizeof(unsigned char), cudaMemcpyDeviceToHost); if (cudaStatus != cudaSuccess) { fprintf(stderr, "here cudaMemcpy failed! error: %s\n", cudaGetErrorString(cudaStatus)); } iterFrame->second.height = frame.height; iterFrame->second.width = frame.width; iterFrame->second.size = frame.size; iterFrame->first = frame_id; iterK->second = frame_id; mp_key.insert({ snaphot_id, frame_id }); return; } } DxGPUFrame dx_frame; /* cudaError_t cudaStatus = cudaMalloc((void**)&dx_frame.frame, frame.size * frame.height * IMG_CHANNELS * sizeof(float)); if (cudaStatus != cudaSuccess) { fprintf(stderr, "here cudaMalloc failed! error: %s\n", cudaGetErrorString(cudaStatus)); }*/ dx_frame.frame = malloc(frame.size * frame.height * IMG_CHANNELS * sizeof(unsigned char)); cudaError_t cudaStatus = cudaMemcpy(dx_frame.frame, frame.frame, IMG_CHANNELS * frame.size * frame.height * sizeof(unsigned char), cudaMemcpyDeviceToHost); if (cudaStatus != cudaSuccess) { fprintf(stderr, "here cudaMemcpy failed! error: %s\n", cudaGetErrorString(cudaStatus)); } dx_frame.height = frame.height; dx_frame.width = frame.width; dx_frame.size = frame.size; mp_frame.push_back({ frame_id, dx_frame }); mp_key.insert({ snaphot_id, frame_id }); } return; } else { //os1 << mp_frame.size() << std::endl; auto unaryF = [&frame_id](std::pair & item_key) { if (item_key.first == frame_id) { return true; } else { return false; } }; auto iterF = std::find_if(mp_frame.begin(), mp_frame.end(), unaryF); if (iterF != mp_frame.end()) //如果该大图已保存,则修改索引 { iterK->second = frame_id; } else { auto iterFrame = mp_frame.begin(); for (; iterFrame != mp_frame.end(); ++iterFrame) { auto unaryPred = [iterFrame](std::pair & item_key) { if (item_key.second == iterFrame->first) { return true; } else { return false; } }; auto iterKey = std::find_if(mp_key.begin(), mp_key.end(), unaryPred); if (iterKey == mp_key.end()&& iterFrame->second.width == frame.width && iterFrame->second.height == frame.height && iterFrame->second.size == frame.size) //如果该大图没保存,则先遍历大图vector,如果某一个大图数据,不被索引map所索引,那么该大图数据将被重新利用 { cudaError_t cudaStatus = cudaMemcpy(iterFrame->second.frame, frame.frame, IMG_CHANNELS * frame.size * frame.height * sizeof(unsigned char), cudaMemcpyDeviceToHost); if (cudaStatus != cudaSuccess) { fprintf(stderr, "here cudaMemcpy failed! error: %s\n", cudaGetErrorString(cudaStatus)); } iterFrame->second.height = frame.height; iterFrame->second.width = frame.width; iterFrame->second.size = frame.size; iterFrame->first = frame_id; iterK->second = frame_id; return; } } DxGPUFrame dx_frame; dx_frame.frame = malloc(IMG_CHANNELS * frame.size * frame.height * sizeof(unsigned char)); cudaError_t cudaStatus = cudaMemcpy(dx_frame.frame, frame.frame, IMG_CHANNELS * frame.size * frame.height * sizeof(unsigned char), cudaMemcpyDeviceToHost); if (cudaStatus != cudaSuccess) { fprintf(stderr, "here cudaMemcpy failed! error: %s\n", cudaGetErrorString(cudaStatus)); } dx_frame.height = frame.height; //如果大图没保存,并且也没有大图数据能被重新利用,那么就新建一条大图数据,放入大图vector dx_frame.width = frame.width; dx_frame.size = frame.size; mp_frame.push_back({ frame_id, dx_frame }); iterK->second = frame_id; } return; } } DxGPUFrame* ImageSaveCache::get_frame(const OBJ_KEY &snaphot_id) { //std::lock_guard l(tx); auto iter = mp_key.find(snaphot_id); if (iter == mp_key.end()) { return nullptr; } else { auto unaryF = [iter](std::pair & item_key) { if (item_key.first == iter->second) { return true; } else { return false; } }; auto iterf = std::find_if(mp_frame.begin(), mp_frame.end(), unaryF); return &iterf->second; } } void ImageSaveCache::release(const OBJ_KEY & snaphot_id) { //std::lock_guard l(tx); auto iter = mp_key.find(snaphot_id); if (iter == mp_key.end()) { return; } else { auto item = *iter; mp_key.erase(iter); //删除索引 auto unaryK = [&item](std::pair & item_key) { if (item_key.second == item.second) { return true; } else { return false; } }; auto iterK = std::find_if(mp_key.begin(), mp_key.end(), unaryK); //如果没有其它快照的最优大图是该图片,则删除该大图 if (iterK == mp_key.end()) { auto unaryF = [&item](std::pair & item_key) { if (item_key.first == item.second) { return true; } else { return false; } }; auto iterF = std::find_if(mp_frame.begin(), mp_frame.end(), unaryF); free(iterF->second.frame); mp_frame.erase(iterF); } auto iterFrame = mp_frame.begin(); for (; iterFrame != mp_frame.end();) { auto unaryPred = [iterFrame](std::pair & item_key) { if (item_key.second == iterFrame->first) { return true; } else { return false; } }; auto iterKey = std::find_if(mp_key.begin(), mp_key.end(), unaryPred); if (iterKey == mp_key.end()) { free(iterFrame->second.frame); iterFrame = mp_frame.erase(iterFrame); continue; } ++iterFrame; } return; } }