在c ++上重复时钟时出现重置窗口的问题
我尝试使用时间chrono重置时间。但是,未经初始化的代码执行时间继续增加。
你好,我是韩国技术学院的学生。使用翻译器。 请原谅我尴尬的讲话。
我正在设计一个程序,该程序使用C ++ OpenPose库来衡量正确的PC用户税。 基本上,我们已经完成了浮动弹出窗口的功能,可以在您的右肩或左肩弯曲时提供反馈。 但是,我想在一秒钟后发出警报,而不是在错误的位置发送反馈。
应该在不执行仰卧功能时,而是在用户坐在错误位置时测量时间。时间将从执行姿势功能的时间开始计算。如果将同一座位从错误的座位拿起20秒钟,就会发生事件。
该事件将在20秒后发生,如果未初始化时间,则将其识别为错误的姿势后立即发生。我认为是因为什么时候。如果该库从何处中断,则以0代码结尾。
一旦我解决了与时间有关的功能,我将要问你一个问题,因为我很难完成程序。 谢谢。
while (!userWantsToExit)
{
// start frame
std::shared_ptr<std::vector<UserDatum>> datumProcessed;
if (opWrapper.waitAndPop(datumProcessed))
{
userWantsToExit = userOutputClass.display(datumProcessed);
userOutputClass.printKeypoints(datumProcessed);
....
//string to int
int subShoulder = stoi(rShoulderY) - stoi(lShoulderY);
//clac keypoint values for posedata
if (50 < subShoulder || -50 > subShoulder)
{
if (stoi(rShoulderY) < stoi(lShoulderY)) {
clock_t t_start, t_end;
int time;
t_start = clock(); //start clock
time = t_start / CLOCKS_PER_SEC;
op::log(time);
if (time > 20) {
t_end = clock(); //end clock
time = (int)(t_end - t_start) / CLOCKS_PER_SEC;
cv::imshow("SUPOSE", imgLshoulderDown);
std::string id = "hjw";
std::string pose = "leftShoulder";
httpRequestPose(id, pose);
}
}
else if (stoi(rShoulderY) > stoi(lShoulderY)) {
clock_t t_start, t_end;
int time;
t_start = clock(); //start clock
time = t_start / CLOCKS_PER_SEC;
op::log(time);
if (time > 20) {
cv::imshow("SUPOSE", imgRshoulderDown);
std::string id = "hjw";
std::string pose = "rightShoulder";
httpRequestPose(id, pose);
}
t_end = clock();
time = (int)(t_end - t_start) / CLOCKS_PER_SEC;
}
else {
clock_t t_start, t_end;
int time;
t_end = clock();
time = (int)(t_end - t_start) / CLOCKS_PER_SEC;
}
}
}
else {}
//op::log("Processed datum could not be emplaced.", op::Priority::High, __LINE__, __FUNCTION__, __FILE__);
}
*图像
答案 0 :(得分:0)
老实说,我很难完全理解您的问题。但是,我是一个学生,英语不好(即使现在),我知道在Google翻译的段落中寻求帮助是多么艰难。因此,我会尝试。
据我了解,如果肩膀保持向左倾斜超过20秒(与向右倾斜相同),您想触发警报。正确吗?
如果正确,我认为问题是您将变量 t_start 保留在poseDetect函数中。这意味着每次检测到姿势时, t_start 就是一个新姿势。值 (t_end-t_start) 始终为0。应在该函数外部声明 t_start 并使用标志以检查是否是第一次。我想用下面的伪代码建议
bool isLeftIncline = false;
clock_t startLeft=clock(); //get current time
void poseDetect()
{
if (50 < subShoulder || -50 > subShoulder){
if (stoi(rShoulderY) < stoi(lShoulderY)){ // should is inclined to the left
if(!isLeftIncline){ // the first time
startLeft=clock(); // get the starting time
isLeftIncline=true;
//trigger for the first time here
}else { // after the first time
clock_t current=clock();
int timeDiff=current-startLeft;
if(timeDiff>20){ //after 20 second with same pose
// issue an alert
}
//or trigger alert every nearly 20 seconds
//if(timeDiff%20<3){
//trigger
//}
}
}else {
// the shoulder no longer inclines to the left
// reset isLeftIncline time
isLeftIncline = false;
}
// you can apply the same for the right incline here
}
}