Code Monkey home page Code Monkey logo

libseek's Introduction

Seek Thermal Imager Library

Introduction

This library can be used to retrieve frames of Seek cameras.

Usage

See the seek-test.cpp example file to see how this is used.

At the moment, there is no thermal information provided by the library... that's TODO.

The example can be plugged onto ffmpeg like this:

./build/seek-test \
 | ffplay -i - -f rawvideo -video_size 208x156 -pixel_format gray16le

The library performs bad pixels correction based on a list of bad pixels; that list can be obtained by running:

# Get 100 raw frames... move the camera around while this runs
./build/seek-test-calib

# Generate bad pixels images (calib-avg.png, calib-std.png, calib-bpc-dead.png)
./test-calib.py

# Generate bad pixels correction structure
./seek_bpc.py

Installation

The library uses the waf build system to compile. This is done using something like (assuming you want to install to /usr):

curl https://waf.io/waf-1.8.14 > waf
python waf configure --prefix /usr
python waf
sudo python waf install --destdir /

The test scripts in Python use numpy and OpenCV, so you should have those dependencies installed to run the scripts.

Issues

The project home is on github: https://github.com/zougloub/libseek and issues can be reported there.

Credits

This library is using bits and pieces from work done by other people.

Thanks to Stephen Stair who put working code on github, and to the rest of the people discussing on the Yet another cheap thermal imager incoming.. Seek Thermal thread of the EEVblog Electronics Community Forum which was about the only thing I found when looking for existing stuff for my camera, once I could plug it on a real computer.

Thanks to David Tulloh for creating and maintaining https://github.com/lod/seek-thermal-documentation/

Legal

The code uses the MIT License as this is used by the winusbdotnet project which was partly slurped in here. See the LICENSE file along with the code.

The source code doesn't contain per-file headers, but this is no excuse for being evil.

The library was developed with interoperability in mind, ie. the goal of providing a working PC interface to the imager, which is yet another USB device, for the people who may have smashed their phone's glass.

Development

Contributing

Hey, this is on github, you know what to do!

TODO

  • Bad Pixel Compensation - Calibration clean-up

    Bad pixels (and bad clusters) are corrected by the core library, but the code used to generate the correction information is not that straightforward to use.

  • gstreamer source

  • Thermal information in the frame (retrieve min/max values)

  • Absolute temperature reading

  • Higher-level wrapper?

  • Movement-based super-resolution?

Device Information

Camera Information

The camera uses a microbolometer array of 12 µm pixels.

It has some kind of shutter, used to perform Flat Field Correction regularly (http://www.flir.com/cvs/cores/knowledgebase/index.cfm?CFTREEITEMKEY=342&view=35774, http://www.google.ca/patents/US8373757) and making the camera alternatively provide shutter images and scene images (shutter operating once every 23 pictures after start-up, and also generating one more unusable frame before the calibration frame).

Issues have been reported with the FFC, and a thermal gradient can be seen through the image.

The sensor array has a fraction (TODO provide) of what we'll call black pixels, pixels that carry no usable data by design. They are thought to exist to improve the SNR.

There are also bad pixels, which are relatively frequent, at least on my unit... where I can see TODO of them. Thus, some kind of compensation needs to be performed on these bad pixels.

Reading from the Camera

lsusb says:

Bus 002 Device 118: ID 289d:0010
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x289d
  idProduct          0x0010
  bcdDevice            1.00
  iManufacturer           1 Seek Thermal
  iProduct                2 PIR206 Thermal Camera
  iSerial                 5 @Ă耀
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           64
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    240
      bInterfaceProtocol      0
      iInterface              3 iAP Interface
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    240
      bInterfaceProtocol      1
      iInterface              4 com.thermal.pir206.1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    240
      bInterfaceProtocol      1
      iInterface              4 com.thermal.pir206.1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)

This library is using the first interface iAP Interface.

The communication protocol is pretty simple, but there's no point (?) to understand it in order to write something usable. The camera is autonomous at providing data, after an initial configuration consisting in a handful of commands, and a "send me data now" request it will provide image frames.

There are different type of frames, that are identified by an in-band status byte located at position 20:

  • Regular frames (code 3)
  • Flat Field Calibration frames (code 1)
  • Drift Calibration frames (code 4 or 10)
  • Unusable frames (code 6), probably because the shutter is in progress
  • TBD (code 8)
  • TBD (code 7)
  • ...

The raw frame data contains regular "holes", values that are "black pixels" by design. The missing values are reconstructed using interpolation from neighboring cells. The locations are predicted, but it's also possible to identify them because the values are also missing in calibration frames.

Special frame locations:

  • At position 2, something that looks like it is related to the device temperature.
  • At position 20, the frame code
  • At position 80, a frame counter.

libseek's People

Contributors

zougloub avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

libseek's Issues

HC-301 it support?

i try but have error

root@raspberrypi:/home/pi/waf/libseek# ./build/seek-test-calib
terminate called after throwing an instance of 'std::runtime_error'
what(): Seek not found
Aborted

Solid gray output

Hi

When I run this I only get a solid gray image. Output from terminal:

~/Downloads/libseek-master
○ sudo ./build/seek-test| ffplay -i - -f rawvideo -video_size 208x156 -pixel_format gray16le
ffplay version 2.8.6-1ubuntu2 Copyright (c) 2003-2016 the FFmpeg developers
built with gcc 5.3.1 (Ubuntu 5.3.1-11ubuntu1) 20160311
configuration: --prefix=/usr --extra-version=1ubuntu2 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
Status byte: 4.000 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 9.000 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Ignore 9
Status byte: 8.000 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Ignore 8
Status byte: 7.000 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Ignore 7
Status byte: a.000 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Ignore 10
Status byte: 5.000 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Ignore 5
Status byte: 1.000 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.000 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Input #0, rawvideo, from 'pipe:':
Duration: N/A, start: 0.000000, bitrate: 12979 kb/s
Stream #0:0: Video: rawvideo (Y1[0][16] / 0x10003159), gray16le, 208x156, 12979 kb/s, 25 tbr, 25 tbn, 25 tbc
Status byte: 3.000 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.072 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 6.153 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Ignore 6
Status byte: 1.153 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.153 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.628 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.709 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.800 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.882 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 6.963 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Ignore 6
Status byte: 1.963 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.963 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.458 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.539 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.621 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.702 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 6.793 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Ignore 6
Status byte: 1.793 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.793 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.278 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.360 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.451 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.533 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 6.614 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Ignore 6
Status byte: 1.614 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.614 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.109 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.192 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.273 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.355 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.446 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.527 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.609 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.690 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.781 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.863 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.944 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.035 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.116 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.198 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.279 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.371 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.462 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.533 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.624 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.705 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 6.787 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Ignore 6
Status byte: 1.787 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.787 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.282 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.363 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.444 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.526 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.617 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.698 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.779 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.871 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.952 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.034 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.125 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.206 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.287 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.368 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.459 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.541 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.622 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.713 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.794 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 3.875 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Status byte: 6.967 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
Ignore 6
Status byte: 1.967 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
^C 9.74 M-V: 6.967 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0

Compiling on fedora

Hi

I installed dependencies like this:

  sudo dnf group install "C Development Tools and Libraries"
  sudo dnf install libusb-devel python2-numpy opencv-python

  python waf configure --prefix /usr
Setting top to                           : /home/larsfp/Downloads/git/libseek 
Setting out to                           : /home/larsfp/Downloads/git/libseek/build 
Checking for 'g++' (C++ compiler)        : /usr/bin/g++ 
Checking for program 'pkg-config'        : /usr/bin/pkg-config 
Checking for 'libusb-1.0'                : yes 
'configure' finished successfully (0.031s)

python waf
...
../seek.cpp:685:16: error: ‘class LibSeek::Frame::impl’ has no member named ‘rawdata’
    m->calib.m->rawdata = frame.m->rawdata;
                ^~~~~~~
../seek.cpp:685:35: error: ‘class LibSeek::Frame::impl’ has no member named ‘rawdata’
    m->calib.m->rawdata = frame.m->rawdata;
                                   ^~~~~~~
../seek.cpp:705:19: error: ‘class LibSeek::Frame::impl’ has no member named ‘rawdata’
      (m->calib.m->rawdata.data())[y*w+x];
                   ^~~~~~~
../seek.cpp:740:36: error: ‘class LibSeek::Imager::impl’ has no member named ‘bpc_list’
   for (int idx_bp = 0; idx_bp < m->bpc_list.size(); idx_bp++) {
                                    ^~~~~~~~
../seek.cpp:742:23: error: ‘class LibSeek::Imager::impl’ has no member named ‘bpc_list’
    tie(x, y, ik) = m->bpc_list[idx_bp];
                       ^~~~~~~~
../seek.cpp:744:18: error: ‘class LibSeek::Imager::impl’ has no member named ‘bpc_kinds’
    auto cnt = m->bpc_kinds[ik];
                  ^~~~~~~~~
../seek.cpp:749:37: error: ‘class LibSeek::Imager::impl’ has no member named ‘bpc_weights’
     v += data[(y+dy)*w+(x+dx)] * m->bpc_weights[iw];
                                     ^~~~~~~~~~~

Waf: Leaving directory `/home/larsfp/Downloads/git/libseek/build'
Build failed
 -> task in 'seek' failed (exit status 1): 
	{task 139796117205392: cxx seek.cpp -> seek.cpp.1.o}
['/usr/bin/g++', '-std=c++11', '-I/usr/include/libusb-1.0', '-DHAVE_LIBUSB=1', '../seek.cpp', '-c', '-o', '/home/larsfp/Downloads/git/libseek/build/seek.cpp.1.o']

frame_get_one: libusb_bulk_transfer returned -7

Hi! When I run test-viewer.py with Raspberrypi 4B the fisrt time, it runs well. But when i exit the program and restart it, the Terminal shows frame_get_one: libusb_bulk_transfer returned -7
. And I have to reboot the pi then it works.
I have also tried adding libusb_clear_halt(handle, 0x81); before res = libusb_bulk_transfer(handle, 0x81, &frame.m->rawdata[done], todo, &actual_length, 500);in seek.cpp and compiling again. But it didn't work.

Absolute temperature reading

I know this is on the TODO list, but I would like to open an issue for it to get more details.
I would like to use this in a project where an absolute reading would be very useful, and the Thermal Seek looks to be the best solution, using your library.
So I'd like to ask, is there perhaps any progress on this? Can I help? I'll buy the Thermal Seek myself soon.

test app error.

./build/seek-test
terminate called after throwing an instance of 'std::runtime_error'
what(): Failed to open device
Aborted (core dumped)

PS: Ubuntu 14.04.4
Device: seek thermal CompactXR(android edition)

Any idea how to fix this?
thanks

Calibration error and average dead pixels.

Hi when I run seek_bpc.py the calibration fails with the following error. This happen regardless of the mentioned commented lines in seek_bpc.py.

"
Traceback (most recent call last):
File "./seek_bpc.py", line 227, in
bpc.correct(img)
File "./seek_bpc.py", line 156, in correct
self.correct_crazy(img)
File "./seek_bpc.py", line 149, in correct_crazy
v += img[y0+y,x0+x] * w
IndexError: invalid index to scalar variable.
"

Also, what is a normal/average dead count?

Thanks for any help.

seek_bpc.py bad_crazy error

Hi, I'm running the instructions to calibrate as given:

./build/seek-test-calib
./test-calib.py
./seek_bpc.py

The first two go fine, but when running seek_bpc.py, I get:

Traceback (most recent call last):
  File "./seek_bpc.py", line 179, in <module>
    bpc.load()
  File "./seek_bpc.py", line 159, in load
    with open("bad_crazy.pickle", "r") as f:
IOError: [Errno 2] No such file or directory: 'bad_crazy.pickle'

If I uncomment the two lines:

bpc.identify()
bpc.save()

Then it seems to run, although by the output:

[001/2322] Finding recipe for bad pixel at (0,10)
...
[002/2322] Finding recipe for bad pixel at (0,26)
...

It's going to take hours/days to complete.

no module found named cv2

when i run following command it gives following errror:
pi@raspberrypi:~/libseek $ ./test-calib.py
Traceback (most recent call last):
File "./test-calib.py", line 6, in
import cv2
ImportError: No module named cv2

What should I modify to work with PRO version?

I am using PRO and what should I modify to use it?
I can access the device and compile but got following error when I ran the test-viewer

frame_get_one: libusb_bulk_transfer returned -7

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.