Compare commits
No commits in common. "f103133b9fdcb8d214d41ceb59f19c696713156e" and "cd1edbe538609d05eeb30ab6f6af16e16cd08158" have entirely different histories.
f103133b9f
...
cd1edbe538
|
@ -2,34 +2,6 @@ import sys
|
|||
import cv2
|
||||
import numpy as np
|
||||
|
||||
def image_resize(image, width = None, height = None, inter = cv2.INTER_AREA):
|
||||
dim = None
|
||||
(h, w) = image.shape[:2]
|
||||
|
||||
if width is None and height is None:
|
||||
return image
|
||||
|
||||
if width is None:
|
||||
r = height / float(h)
|
||||
dim = (int(w * r), height)
|
||||
else:
|
||||
r = width / float(w)
|
||||
dim = (width, int(h * r))
|
||||
resized = cv2.resize(image, dim, interpolation = inter)
|
||||
|
||||
return resized
|
||||
|
||||
def display (image) :
|
||||
resized = image_resize(image, 800, 800)
|
||||
cv2.imshow('img', resized)
|
||||
|
||||
while True:
|
||||
key = cv2.waitKey(0)
|
||||
if key == 27:
|
||||
cv2.destroyAllWindows()
|
||||
break
|
||||
exit(0)
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print('Please provide path to image for analysis')
|
||||
exit(1)
|
||||
|
@ -43,66 +15,4 @@ templateFile = sys.argv[-1]
|
|||
|
||||
print(f'Analyzing {scanImage} and creating {templateFile}')
|
||||
|
||||
img = cv2.imread(scanImage)
|
||||
|
||||
height, width = img.shape[:2]
|
||||
|
||||
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
||||
|
||||
blur = cv2.medianBlur(gray, 31)
|
||||
|
||||
ret, thresh = cv2.threshold(blur, 200, 255, cv2.THRESH_BINARY)
|
||||
|
||||
canny = cv2.Canny(thresh, 75, 200)
|
||||
|
||||
contours, hierarchy = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
|
||||
|
||||
contour_list = []
|
||||
area_list = []
|
||||
for contour in contours:
|
||||
approx = cv2.approxPolyDP(contour, 0.01 * cv2.arcLength(contour, True), True)
|
||||
area = cv2.contourArea(contour)
|
||||
area_list.append(area)
|
||||
contour_list.append(contour)
|
||||
|
||||
maxArea=0
|
||||
maxIndex=0
|
||||
|
||||
for i in range(len(area_list)) :
|
||||
area = area_list[i]
|
||||
if area > maxArea:
|
||||
maxArea = area
|
||||
maxIndex = i
|
||||
|
||||
count = 0
|
||||
hole_punches = []
|
||||
centers = []
|
||||
centersStr = []
|
||||
area_range = 0
|
||||
|
||||
# pretty good
|
||||
# add position constraint
|
||||
|
||||
while count < 6 :
|
||||
area_range+=1
|
||||
for i in range(len(area_list)) :
|
||||
area = area_list[i]
|
||||
if area == maxArea or area * ((100 + area_range) / 100) > maxArea :
|
||||
M = cv2.moments(contour_list[i])
|
||||
cX = int(M["m10"] / M["m00"])
|
||||
cY = int(M["m01"] / M["m00"])
|
||||
strC = f'{cX},{cY}'
|
||||
if strC in centersStr :
|
||||
continue
|
||||
centers.appendStr(strC)
|
||||
corners.append((cX, cY))
|
||||
print(f'{cX},{cY}')
|
||||
cv2.circle(img, (cX, cY), 40, (255, 0, 0), -1)
|
||||
hole_punches.append(contour_list[i])
|
||||
count+=1
|
||||
print(f'Found hole punches within {area_range}% of largest')
|
||||
|
||||
|
||||
cv2.drawContours(img, hole_punches, -1, (0, 255, 0), 20)
|
||||
display(img)
|
||||
|
||||
#https://stackoverflow.com/questions/51456660/opencv-detecting-drilled-holes
|
|
@ -1,149 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
###########################
|
||||
#
|
||||
# Run the stipple_gen script on a sequence
|
||||
# of PNG images and then render the resulting
|
||||
# preview images into a video. Fluctuate settings
|
||||
# via a sine wave.
|
||||
#
|
||||
###########################
|
||||
|
||||
if [[ "${1}" == "" ]]; then
|
||||
echo "Please provide a directory of images as the first argument"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
INPUT=`realpath "${1}"`
|
||||
OUTPUT=`realpath "${2}"`
|
||||
CONFIG="${3}"
|
||||
SINGLE="${4}"
|
||||
|
||||
if [ ! -d "${INPUT}" ]; then
|
||||
echo "Directory ${1} doesn't exist"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
mkdir -p "${OUTPUT}"
|
||||
|
||||
PI=3.14159265359
|
||||
FPS=24
|
||||
MULTIPLE=3
|
||||
STEP=$(echo "scale=6;360/45" | bc -l)
|
||||
AMP=1.0
|
||||
STARTANGLE=270
|
||||
|
||||
RATE=`echo "scale=0;${FPS}/${MULTIPLE}" | bc`
|
||||
|
||||
WIDTH=404
|
||||
HEIGHT=374
|
||||
|
||||
DOTSIZE_MIN=1.8
|
||||
DOTSIZE_MAX=6
|
||||
DOTSIZE_HALF=`echo "scale=6;($DOTSIZE_MAX - $DOTSIZE_MIN) / 2" | bc`
|
||||
DOTSIZE=`echo "scale=6;($DOTSIZE_MIN + $DOTSIZE_HALF)" | bc`
|
||||
DOTSIZE_MULTIPLE=$DOTSIZE_HALF
|
||||
PARTICLES_MIN=200
|
||||
PARTICLES_MAX=1000
|
||||
PARTICLES_HALF=`echo "($PARTICLES_MAX - $PARTICLES_MIN) / 2" | bc`
|
||||
PARTICLES=$((PARTICLES_MIN+PARTICLES_HALF))
|
||||
PARTICLES_MULTIPLE=$PARTICLES_HALF
|
||||
|
||||
if [[ "${CONFIG}" == "" ]]; then
|
||||
echo "Please provide a config file"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
IMAGES=""
|
||||
|
||||
fluctuation () {
|
||||
i=$1
|
||||
ANGLE=$(echo "scale=6;$STARTANGLE+($i * $STEP)" | bc)
|
||||
FLUCTUATION=$(echo "scale=6;s($ANGLE*($PI/180))*$AMP" | bc -l)
|
||||
echo $FLUCTUATION
|
||||
}
|
||||
|
||||
stipple () {
|
||||
png="${1}"
|
||||
frame="${2}"
|
||||
rand="${3}"
|
||||
filename=`basename "${png}"`
|
||||
name=`echo "${filename}" | cut -d'.' -f1`
|
||||
num=`echo "${name}" | awk -F'_' '{print $(NF)}'`
|
||||
tmp=`mktemp`.png
|
||||
fluc=`fluctuation $rand`
|
||||
particles=`echo "scale=0;($PARTICLES-($fluc*$PARTICLES_MULTIPLE))/1" | bc`
|
||||
dotsize=`echo "scale=6;$DOTSIZE+($fluc*$DOTSIZE_MULTIPLE)" | bc`
|
||||
#echo $fluc
|
||||
echo "maxParticles: $particles"
|
||||
echo "dotSizeFactor: $dotsize"
|
||||
|
||||
bash white.sh "${png}" "${tmp}"
|
||||
|
||||
source "${CONFIG}"
|
||||
|
||||
cd ~/src/stipple_gen/
|
||||
bash stipple_gen.sh \
|
||||
--inputImage "${tmp}" \
|
||||
--outputImage "${OUTPUT}/${name}_rendered.png" \
|
||||
--outputSVG "${OUTPUT}/${name}.svg" \
|
||||
--config "${CONFIG}" \
|
||||
--dotSizeFactor $dotsize \
|
||||
--maxParticles $particles
|
||||
|
||||
if [[ "${invert}" == "true" ]]; then
|
||||
convert "${OUTPUT}/${name}_rendered.png" -channel RGB -negate "${OUTPUT}/${name}_rendered.png"
|
||||
fi
|
||||
|
||||
rm "${tmp}"
|
||||
cd ~/src/animation/
|
||||
|
||||
if [ "${MODE}" != "tsp" ]; then
|
||||
opt=`mktemp`.svg
|
||||
CURRENT=$(pwd)
|
||||
cd /
|
||||
svgsort --no-adjust "${OUTPUT}/${name}.svg" "${opt}"
|
||||
cd $CURRENT
|
||||
mv "${opt}" "${OUTPUT}/${name}.svg"
|
||||
fi
|
||||
}
|
||||
|
||||
random_int () {
|
||||
shuf -i 1-360 -n 1
|
||||
}
|
||||
|
||||
if [[ "${SINGLE}" != "" ]]; then
|
||||
echo "Rendering a single frame, #${SINGLE}"
|
||||
#files in dir
|
||||
for png in "${INPUT}/"*.png ; do
|
||||
if [[ ${i} -eq ${SINGLE} ]]; then
|
||||
r=$(random_int)
|
||||
#echo $r
|
||||
stipple "${png}" ${i} ${r}
|
||||
break
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
|
||||
exit
|
||||
fi
|
||||
|
||||
i=0;
|
||||
#files in dir
|
||||
for png in "${INPUT}/"*.png ; do
|
||||
r=$(random_int)
|
||||
#echo $r
|
||||
stipple "${png}" ${i} ${r}
|
||||
i=$((i+1))
|
||||
done
|
||||
|
||||
if [[ "${IMAGES}" == "" ]]; then
|
||||
part=`echo "${name}" | awk -F'_0' '{print $1}'`
|
||||
IMAGES="${OUTPUT}/${part}_%06d_rendered.png"
|
||||
VIDEO="${OUTPUT}/${part}.mov"
|
||||
fi
|
||||
|
||||
ffmpeg -y -r ${RATE} -f image2 -i "${IMAGES}" \
|
||||
-r ${FPS} \
|
||||
-c:v prores_ks -profile:v 3 \
|
||||
"${VIDEO}"
|
Loading…
Reference in New Issue