summaryrefslogtreecommitdiff
path: root/2003/i/buzz/src/camera/camera.cc
diff options
context:
space:
mode:
Diffstat (limited to '2003/i/buzz/src/camera/camera.cc')
-rw-r--r--2003/i/buzz/src/camera/camera.cc45
1 files changed, 42 insertions, 3 deletions
diff --git a/2003/i/buzz/src/camera/camera.cc b/2003/i/buzz/src/camera/camera.cc
index 27132f9..5bc6920 100644
--- a/2003/i/buzz/src/camera/camera.cc
+++ b/2003/i/buzz/src/camera/camera.cc
@@ -19,7 +19,7 @@
Camera::Camera ()
{
// Taille par défaut.
- m_w = 352; m_h = 288;
+ m_w = 352; m_h = 288; m_d = 1;
m_cut = 0;
// Ouvre le périphérique.
m_fd = open (CAM_FILE, O_RDONLY);
@@ -44,6 +44,12 @@ Camera::Camera ()
m_h = rc.getNum ();
cout << "camera height " << m_h << endl;
}
+ else if (rc.isId ("depth"))
+ {
+ rc.getId ();
+ m_d = rc.getNum ();
+ cout << "camera depth " << m_d << endl;
+ }
else if (rc.isId ("cut"))
{
rc.getId ();
@@ -60,6 +66,8 @@ Camera::Camera ()
endl;
ioctl (m_fd, CAM_SCCBWRITE, &param);
}
+ else
+ rc.noId ();
}
// Affiche les paramètres.
cout << hex << "camera sccbdump";
@@ -74,8 +82,9 @@ Camera::Camera ()
}
cout << endl << dec;
// Paramètre la taille de frame.
- ioctl (m_fd, CAM_SETHCOUNT, &m_w);
- m_frameSize = m_w * m_h + m_cut;
+ int hcount = m_w * m_d;
+ ioctl (m_fd, CAM_SETHCOUNT, &hcount);
+ m_frameSize = m_w * m_h * m_d + m_cut;
ioctl (m_fd, CAM_SETFRAMESIZE, &m_frameSize);
}
@@ -99,3 +108,33 @@ Camera::read (unsigned char *image) const
cout << "camera read " << r << endl;
return r;
}
+
+// Lit une image en RGB.
+int
+Camera::readRGB (unsigned char *rgb) const
+{
+ int ret;
+ // Alloue de la mémoire.
+ unsigned char *image = new unsigned char[m_frameSize];
+ // Lit les données sur la camera.
+ ret = ::read (m_fd, image, m_frameSize);
+ cout << "camera read " << ret << endl;
+ if (!ret) return 0;
+ // Positions de débuts.
+ unsigned char *r, *g, *b;
+ r = image + m_cut + 2;
+ g = image + m_cut + 1;
+ b = image + m_cut;
+ // Décode les couleurs.
+ for (int i = 0; i < m_w * m_h; ++i)
+ {
+ *rgb++ = *r;
+ r += 4;
+ *rgb++ = *g;
+ g += 4;
+ *rgb++ = *b;
+ b += 4;
+ }
+ return ret - m_cut;
+}
+