File: convert_image_to_point_cloud.py

package info (click to toggle)
pcl 1.13.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 143,524 kB
  • sloc: cpp: 518,578; xml: 28,792; ansic: 13,676; python: 334; lisp: 93; sh: 49; makefile: 30
file content (61 lines) | stat: -rwxr-xr-x 1,403 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#/usr/bin/env python

import sys
import Image

# Settings:
# Color of background pixels
backgroundpixel = (255, 255, 255)
# scale the point cloud to fit inside (-1,-1) - (1,1)
scaling = True 

im = Image.open (sys.argv[1])

# resulting point cloud vector
points = []

# minimal/maximal pixel positions that contain non-background
minimum = [d for d in im.size]
maximum = [0, 0]

for x in range (im.size[0]):
  for y in range (im.size[1]):
    px = im.getpixel((x,y))
    if (px != backgroundpixel):
      points.append ([x, y, 0, px[0], px[1], px[2]])
      if maximum[0] < x:
        maximum[0] = x
      if minimum[0] > x:
        minimum[0] = x
      if maximum[1] < y:
        maximum[1] = y
      if minimum[1] > y:
        minimum[1] = y

size_x = maximum[0] - minimum[0]
size_y = maximum[1] - minimum[1]

if (size_x > size_y):
  scale = [1.0, float (size_y) / size_x]
else:
  scale = [float (size_x) / size_y, 1.0]

if scaling:
  #aspect_ratio = 
  for p in points:
    for d in range(2):
      p[d] = scale[d] * ((float (p[d]) - minimum[d]) / (maximum[d] - minimum[d]) * 2.0 - 1.0)

print "VERSION .7"
print "FIELDS x y z rgb "
print "SIZE 4 4 4 4"
print "TYPE F F F F"
print "COUNT 1 1 1 1"
print "WIDTH %i" % len (points)
print "HEIGHT 1"
print "VIEWPOINT 0 0 0 1 0 0 0"
print "POINTS %i" % len (points)
print "DATA ascii"

for p in points:
  print p[0], p[1], p[2], p[3]<<16 | p[4]<<8 | p[5]