Skip to content

Commit 809a5c5

Browse files
committed
add buster posey mvp scripts
1 parent 971a7ef commit 809a5c5

3 files changed

Lines changed: 135 additions & 0 deletions

File tree

‎buster-posey-mvp/README.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
### Buster Posey MVP
2+
3+
The code behind the story [Buster Posey’s Pitch Framing Makes Him A Potential MVP](http://fivethirtyeight.com/features/buster-poseys-pitch-framing-makes-him-a-potential-mvp/).
4+
5+
File | Description
6+
---|---------
7+
`baseball_imgcap_for_release.py` | Captures and crops images from a computer screen every .05 seconds.
8+
`catcher_framing_capture.R` | Reads the images into R and calculates the number of pixels changed between successive images.
9+
10+
Source: [Bloomberg Video](https://www.bsports.com/pro#.Vbo2RvlVhBc)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from PIL import ImageFile
2+
from PIL import ImageGrab
3+
from PIL import *
4+
import time
5+
import sys
6+
import glob
7+
import math
8+
import os
9+
import gc
10+
from multiprocessing import Process
11+
import win32ui
12+
import win32gui
13+
import win32con
14+
15+
def piccap(i, w=300, h=300):
16+
hwnd = win32gui.GetDesktopWindow()
17+
wDC = win32gui.GetWindowDC(hwnd)
18+
dcObj = win32ui.CreateDCFromHandle(wDC)
19+
cDC = dcObj.CreateCompatibleDC()
20+
dataBitMap = win32ui.CreateBitmap()
21+
dataBitMap.CreateCompatibleBitmap(dcObj, w, h)
22+
cDC.SelectObject(dataBitMap)
23+
cDC.BitBlt((0, 0), (w, h), dcObj, (800, 300), win32con.SRCCOPY)
24+
dataBitMap.SaveBitmapFile(cDC, "./" + str(i) + "img.png")
25+
win32gui.DeleteObject(dataBitMap.GetHandle())
26+
dcObj.DeleteDC()
27+
cDC.DeleteDC()
28+
win32gui.ReleaseDC(hwnd, wDC)
29+
gc.collect()
30+
31+
def piccapCom2(cut):
32+
i = 0
33+
for i in range(0, cut):
34+
ti = time.clock()
35+
piccap(i)
36+
while time.clock() < (ti + .05):
37+
pass
38+
39+
'''first, capture all the screens'''
40+
'''movies needs to play simultaneously'''
41+
piccapCom2(int(sys.argv[1]))
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
##library I use for reading in images.
2+
library(bmp)
3+
4+
##attempting to capture the moment immediately after catching
5+
##made a list of each moment for susac and for posey
6+
posey <- c(30, 167, 332, 457, 822, 1016, 1199,
7+
1437, 1621, 1770, 1924, 2101, 2251, 2442, 2594,
8+
2757, 2918, 3072, 3205, 3356, 3526, 3685,
9+
4068, 4217)
10+
susac <- c(751, 1286, 1485, 1666, 2030,
11+
2187)
12+
13+
##for Posey
14+
##read in files
15+
v <- list.files("buster_posey_catching/")
16+
v <- v[order(as.numeric(unlist(lapply(strsplit(v, split="i"), "[[", 1))))]
17+
setwd("buster_posey_catching/")
18+
full <- list()
19+
for(i in 1:length(v))
20+
{
21+
full[[i]] <- read.bmp(v[i])
22+
}
23+
setwd("../")
24+
25+
##compare motion patterns across frames
26+
posz <- vector()
27+
for(i in 2:length(full))
28+
{
29+
posz[i] <- sum(abs(full[[i]][1:250,1:250,2:4]-full[[i-1]][1:250,1:250,2:4])>1)
30+
print(i)
31+
}
32+
33+
posm <- list()
34+
for(i in 1:length(posey))
35+
{
36+
posm[[i]] <- posz[posey[i]:(posey[i]+100)]
37+
}
38+
39+
##same for Susac!
40+
v <- list.files("andrew_susac_catching/")
41+
v <- v[order(as.numeric(unlist(lapply(strsplit(v, split="i"), "[[", 1))))]
42+
setwd("andrew_susac_catching/")
43+
full <- list()
44+
for(i in 1:length(v))
45+
{
46+
full[[i]] <- read.bmp(v[i])
47+
}
48+
setwd("../")
49+
50+
susz <- vector()
51+
for(i in 2:length(full))
52+
{
53+
susz[i] <- sum(abs(full[[i]][1:250,1:250,2:4]-full[[i-1]][1:250,1:250,2:4])>1)
54+
print(i)
55+
}
56+
57+
susm <- list()
58+
for(i in 1:length(susac))
59+
{
60+
susm[[i]] <- susz[susac[i]:(susac[i]+100)]
61+
}
62+
63+
##now averaging motion patterns
64+
##across the receptions
65+
posv <- vector()
66+
susv <- vector()
67+
68+
for(i in 1:100)
69+
{
70+
posv[i] <- mean(unlist(lapply(posm, "[[", i)))
71+
}
72+
73+
for(i in 1:100)
74+
{
75+
susv[i] <- mean(unlist(lapply(susm, "[[", i)))
76+
}
77+
78+
plot(posv[1:20], type="l", col="red", lwd=3,
79+
ylim=c(80000, 120000), xlab="Time", xaxt="no",
80+
ylab="Total Pixel Movement")
81+
lines(susv[1:20], type="l", col="blue", lwd=3)
82+
axis(side=1, at=c(0,5,10,15,20),
83+
labels=as.character(c(0,5,10,15,20)*.05))
84+

0 commit comments

Comments
 (0)