jonigata commited on
Commit
0bcf596
·
1 Parent(s): 1d98bca

support undetected nodes

Browse files
Files changed (2) hide show
  1. app.py +1 -1
  2. static/poseEditor.js +18 -11
app.py CHANGED
@@ -95,7 +95,7 @@ with gr.Blocks() as demo:
95
  | Import | Paste json to "Json source" and click "Import Json", edit the width/height, then click "Start edit". |
96
  | Export | click "Save" and "Copy to clipboard" of "Json" section. |
97
  """)
98
- json = gr.JSON(label="Json", lines=10)
99
  jsonInput = gr.Textbox(label="Json source", lines=10)
100
  jsonInputBtn = gr.Button(value="Import Json")
101
  with gr.Column(scale=2):
 
95
  | Import | Paste json to "Json source" and click "Import Json", edit the width/height, then click "Start edit". |
96
  | Export | click "Save" and "Copy to clipboard" of "Json" section. |
97
  """)
98
+ json = gr.JSON(label="Json")
99
  jsonInput = gr.Textbox(label="Json source", lines=10)
100
  jsonInputBtn = gr.Button(value="Import Json")
101
  with gr.Column(scale=2):
static/poseEditor.js CHANGED
@@ -25,7 +25,8 @@ const sampleSubsetElementSource = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
25
  function makePoseFromCandidateAndSubsetElement(candidate, subsetElement) {
26
  var pose = [];
27
  for (let j = 0 ; j < 18; j++) {
28
- pose.push(candidate[subsetElement[j]]);
 
29
  }
30
  return pose;
31
  }
@@ -93,8 +94,11 @@ function drawBodyPose() {
93
 
94
  // edge
95
  for (let j = 0; j < 17; j++) {
96
- const [X0, Y0] = pose[limbSeq[j][0]-1];
97
- const [X1, Y1] = pose[limbSeq[j][1]-1];
 
 
 
98
  ctx.beginPath();
99
  ctx.lineWidth=stickWidth;
100
  ctx.strokeStyle = `rgb(${colors[j].join(',')})`;
@@ -106,7 +110,9 @@ function drawBodyPose() {
106
  // node
107
  ctx.font = '12px serif';
108
  for (let j = 0; j < 18; j++) {
109
- const [x, y] = pose[j];
 
 
110
  ctx.beginPath();
111
  ctx.arc(x, y, stickWidth*1.2, 0, 2 * Math.PI);
112
  ctx.fillStyle = `rgb(${colors[j].join(',')})`;
@@ -150,7 +156,9 @@ function getNearestNode(p) {
150
  for (let i = 0; i < poseData.length; i++) {
151
  const pose = poseData[i];
152
  for (let j = 0; j < pose.length; j++) {
153
- const d = distSq(p, pose[j]);
 
 
154
  if (d < minDistSq) {
155
  minDistSq = d;
156
  personIndex = i;
@@ -233,8 +241,9 @@ function handleMouseDown(event) {
233
 
234
  if (event.altKey || event.ctrlKey || event.shiftKey) {
235
  // dragMarksを設定
236
- dragMarks[personIndex] = dragMarks[personIndex].map((node) => true);
237
- isDragging = true;
 
238
  if (event.altKey) {
239
  dragMode = "move";
240
  } else if (event.ctrlKey) {
@@ -245,8 +254,8 @@ function handleMouseDown(event) {
245
  }
246
  } else if (keyDownFlags["Space"]) {
247
  dragMarks[personIndex] =
248
- dragMarks[personIndex].map(
249
- (node) => distSq(p, node) < dragRange ** 2);
250
  isDragging = dragMarks[personIndex].some((mark) => mark);
251
  dragMode = "move";
252
  } else if (minDist < 16) {
@@ -277,9 +286,7 @@ function handleMouseMove(event) {
277
  rotateBaseVector = dragOffset;
278
  if (!event.shiftKey) {
279
  dragMode = "rotate2";
280
- console.log("rotate2");
281
  }
282
- console.log("!");
283
  } else if (dragMode == "rotate2") {
284
  // 回転
285
  let angle = directedAngleTo(rotateBaseVector, dragOffset);
 
25
  function makePoseFromCandidateAndSubsetElement(candidate, subsetElement) {
26
  var pose = [];
27
  for (let j = 0 ; j < 18; j++) {
28
+ let i = subsetElement[j];
29
+ pose.push(i < 0 ? null : candidate[i]);
30
  }
31
  return pose;
32
  }
 
94
 
95
  // edge
96
  for (let j = 0; j < 17; j++) {
97
+ const p = pose[limbSeq[j][0]-1];
98
+ const q = pose[limbSeq[j][1]-1];
99
+ if (p == null || q == null) continue;
100
+ const [X0, Y0] = p;
101
+ const [X1, Y1] = q;
102
  ctx.beginPath();
103
  ctx.lineWidth=stickWidth;
104
  ctx.strokeStyle = `rgb(${colors[j].join(',')})`;
 
110
  // node
111
  ctx.font = '12px serif';
112
  for (let j = 0; j < 18; j++) {
113
+ const p = pose[j];
114
+ if (p == null) continue;
115
+ const [x, y] = p;
116
  ctx.beginPath();
117
  ctx.arc(x, y, stickWidth*1.2, 0, 2 * Math.PI);
118
  ctx.fillStyle = `rgb(${colors[j].join(',')})`;
 
156
  for (let i = 0; i < poseData.length; i++) {
157
  const pose = poseData[i];
158
  for (let j = 0; j < pose.length; j++) {
159
+ const q = pose[j];
160
+ if (q == null) continue;
161
+ const d = distSq(p, q);
162
  if (d < minDistSq) {
163
  minDistSq = d;
164
  personIndex = i;
 
241
 
242
  if (event.altKey || event.ctrlKey || event.shiftKey) {
243
  // dragMarksを設定
244
+ dragMarks[personIndex] =
245
+ poseData[personIndex].map((node) => node != null);
246
+ isDragging = true;
247
  if (event.altKey) {
248
  dragMode = "move";
249
  } else if (event.ctrlKey) {
 
254
  }
255
  } else if (keyDownFlags["Space"]) {
256
  dragMarks[personIndex] =
257
+ poseData[personIndex].map(
258
+ (node) => node != null && distSq(p, node) < dragRange ** 2);
259
  isDragging = dragMarks[personIndex].some((mark) => mark);
260
  dragMode = "move";
261
  } else if (minDist < 16) {
 
286
  rotateBaseVector = dragOffset;
287
  if (!event.shiftKey) {
288
  dragMode = "rotate2";
 
289
  }
 
290
  } else if (dragMode == "rotate2") {
291
  // 回転
292
  let angle = directedAngleTo(rotateBaseVector, dragOffset);