Git Product home page Git Product logo

openpnp-capture's Introduction

OpenPNP Logo

OpenPnP

Open Source SMT Pick and Place Hardware and Software

Introduction

OpenPnP is a project to create the plans, prototype and software for a completely Open Source SMT pick and place machine that anyone can afford. I believe that with the ubiquity of cheap, precise motion control hardware, some ingenuity and plenty of Open Source software it should be possible to build and own a fully functional SMT pick and place machine for under $1000.

Project Status

OpenPnP is stable and in wide use. It is still under heavy development and new features are added continuously. See the Downloads page to get started.

If you would like to keep up with our progress you can Watch this project on GitHub, check out our Twitter, join the discussion group, or come chat with us on Discord.

Contributing

Build Status Help Wanted Bugs Feature Requests Enhancements

Before starting work on a pull request, please read: https://github.com/openpnp/openpnp/wiki/Developers-Guide#contributing

Summary of guidelines:

  • One pull request per issue.
  • Describe the change.
  • Follow the coding style.
  • Include tests and documentation.
  • Think of the big picture.

Thanks

Many thanks to ej-technologies for providing a complimentary license of install4j. install4j creates high quality, professional installers for Java applications.

More information at http://www.ej-technologies.com/products/install4j/overview.html.

openpnp-capture's People

Contributors

asakurayui520 avatar bakwc avatar brainstorm avatar eao197 avatar peejay avatar raymanfx avatar sampepose avatar sandman42292 avatar trcwm avatar vonnieda 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  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

openpnp-capture's Issues

ActiveMovie popup on Windows 11

On WIndows 11, when I open a local webcam, a new window titled "ActiveMovie" is created by dwm.exe and displays the video. I can't seem to get rid of it even though I found people complaining about something similar back in 2003. Is there anything (including changes to openpnp-capture) I can do to prevent this?
Thank you!

libjpegturbo needs to be built during build to static link

On Linux, we can't currently link a static version of libjpegturbo due to a bug in that library's release. Due to this, we link a shared version of the library but this causes the library to fail to load on machines without a local copy of libjpegturbo. To resolve this we'll need to download and build libjpegturbo ourselves during our build process.

More notes on exactly how to do this in https://github.com/openpnp/openpnp-capture/blob/master/CMakeLists.txt#L120

Add audio support to the lib

Hi,

I've just forked your lib and modify the CMakeLists.txt to provide a way to build the lib as shared or static lib.
I've also added some flag to the open stream method to show or hide the preview window.
This works great at least under windows but I was wondering if you plan to add support to get the audio streams from the webcam.
If not, do you know third party lib which could do the job ?

Best regards

Setting FPS on Windows and Mac OS not implemented

Issue

The new OpenPNPCaptureCamera is a great improvement. I would first like to express my gratitude for sharing this, before turning to a minor issue:

The Windows port of openpnp-capture does not implement custom FPS setting…

bool PlatformStream::setFrameRate(uint32_t fps)

…nor does the mac port
bool PlatformStream::setFrameRate(uint32_t fps)

…only the Linux port does
bool PlatformStream::setFrameRate(uint32_t fps)

Not being able to reduce the native streamed video bandwidth will prevent two fast hires cameras like the “6mm 2MP Full HD High Speed MJPEG USB” to share one root USB bus.

How to Reproduce

Connect two “6mm 2MP Full HD High Speed MJPEG USB” to a Windows system. Try to configure as OpenPNPCaptureCamera. One camera view will always stay black.
grafik

Conversely the same hardware on separate root USB hubs:
grafik

I reproduced this on Windows 7 / DELL Precision M4800 many times with different USB hubs, some brand new and including a USB 3.0 Hub.

Background

It should be noted that there are different ELP cameras. Mine are the “6mm 2MP Full HD High Speed MJPEG USB” (ebay listing no longer active) with these specs:

1920 (H) x 1080 (V) pixels MJPEG 30fps YUY2 6fps
1280 (H) x 1024 (V) pixels MJPEG 30fps YUY2 6fps
1280 (H) x 720 (V) pixels MJPEG 60fps YUY2 9fps
1024 (H) x 768 (V) pixels MJPEG 30fps YUY2 9fps
800 (H) x 600 (V) pixels MJPEG 60fps YUY2 21fps
640 (H) x 480 (V) pixels MJPEG 120fps YUY2 30fps
352(H) x 288 (V) pixels MJPEG 120fps YUY2 30fps
320 (H) x 240 (V) pixels MJPEG 120fps YUY2 30fps

There are slower ones like the “ELP 6mm 1.0MP 720P HD MJPEG USB Camera

1280 (H) x 720 (V) pixels MJPEG 30fps YUY2 10fps
960 (H) x 720 (V) pixels MJPEG 30fps YUY2 15fps
800 (H) x 600 (V) pixels MJPEG 30fps YUY2 20fps
640 (H) x 480 (V) pixels MJPEG 30fps YUY2 30fps
352(H) x 288 (V) pixels MJPEG 30fps YUY2 30fps
320 (H) x 240 (V) pixels MJPEG 30fps YUY2 30fps
176(H) x 144 (V) pixels MJPEG 30fps YUY2 30fps
160 (H) x 120 (V) pixels MJPEG 30fps YUY2 30fps

Doubling the FPS on the same resolution explains for me why USB 2.0 can still be flooded by a single high speed hires cameras. If one could reduce the FPS this could perhaps be resolved for those who would like to share one USB connection.

Priority

I would like to comment that I reported this issue as suggested here. This is not a pressing priority for me. I rather benefit from high FPS and best resolution and use two seperate USB connectors on my computer.

As reported before, I just thought that the Wiki should perhaps be updated.

error in building path on Mac

sorry to bother you, I'm trying to test the QtCaptureTest on Mac, when i run the command in QtCaptureTest directory > DYLD_LIBRARY_PATH=../build ./QtCaptureTest
, it came error,
x@x-Pro QtCaptureTest % DYLD_LIBRARY_PATH=../build ./QtCaptureTest zsh: no such file or directory: ./QtCaptureTest

when i tried to run this command at master directory openpnp-capture-master, x@x-Pro openpnp-capture-master % > DYLD_LIBRARY_PATH=../build ./QtCaptureTest zsh: no such file or directory: DYLD_LIBRARY_PATH=../build.

I'm new to code, and I will appreciate for u help .

here is my system info mac 2019 i9 Monterey 12.6

Could not create IAMCameraControl

Hi,
All invoked commands return invalid stream with Could not create IAMCameraControl as message

D:\DevStudio\openpnp-capture\build\win\tests\Debug>openpnp-capture-test.exe 0 18
==============================
 OpenPNP Capture Test Program
 Win 64 bit debug v0.0.22-2-g6ce14f6 May 10 2021
==============================
== PlatformContext created
== Enumerating devices
== ICreateDevEnum created
==      -> PATH \\?\USB#VID_F622&PID_1500#7&36cf0647&0&3#{ae18aa60-7f6a-11d4-97dd-00010229b959}
== enumerateFrameInfo() called
support SSE4.1
== Capture pin found!
== Stream has 21 capabilities.
== 2592 x 1944  0 fps  24 bpp FOURCC= BGR
== 2048 x 1536  0 fps  24 bpp FOURCC= BGR
== 1920 x 1440  0 fps  24 bpp FOURCC= BGR
== 1920 x 1080  0 fps  24 bpp FOURCC= BGR
== 1600 x 1200  0 fps  24 bpp FOURCC= BGR
== 1440 x 1080  0 fps  24 bpp FOURCC= BGR
== 1296 x 972  0 fps  24 bpp FOURCC= BGR
== 1296 x 972  0 fps  24 bpp FOURCC= BGR
== 1296 x 972  0 fps  24 bpp FOURCC= BGR
== 1296 x 972  0 fps  24 bpp FOURCC= BGR
== 1296 x 972  0 fps  24 bpp FOURCC= BGR
== 1280 x 960  0 fps  24 bpp FOURCC= BGR
== 1280 x 960  0 fps  24 bpp FOURCC= BGR
== 1024 x 768  0 fps  24 bpp FOURCC= BGR
== 1024 x 768  0 fps  24 bpp FOURCC= BGR
== 1024 x 768  0 fps  24 bpp FOURCC= BGR
== 800 x 600  0 fps  24 bpp FOURCC= BGR
== 800 x 600  0 fps  24 bpp FOURCC= BGR
== 640 x 480  0 fps  24 bpp FOURCC= BGR
== 648 x 486  0 fps  24 bpp FOURCC= BGR
== 648 x 486  0 fps  24 bpp FOURCC= BGR
== ID 0 ->  Camera MV-U500#96B5CF08-3
Number of devices: 1
ID 0 ->  Camera MV-U500#96B5CF08-3
Unique:   Camera MV-U500#96B5CF08-3 \\?\USB#VID_F622&PID_1500#7&36cf0647&0&3#{ae18aa60-7f6a-11d4-97dd-00010229b959}
  Number of formats: 21
  Format ID 0: 2592 x 1944 pixels  FOURCC= BGR
  Format ID 1: 2048 x 1536 pixels  FOURCC= BGR
  Format ID 2: 1920 x 1440 pixels  FOURCC= BGR
  Format ID 3: 1920 x 1080 pixels  FOURCC= BGR
  Format ID 4: 1600 x 1200 pixels  FOURCC= BGR
  Format ID 5: 1440 x 1080 pixels  FOURCC= BGR
  Format ID 6: 1296 x 972 pixels  FOURCC= BGR
  Format ID 7: 1296 x 972 pixels  FOURCC= BGR
  Format ID 8: 1296 x 972 pixels  FOURCC= BGR
  Format ID 9: 1296 x 972 pixels  FOURCC= BGR
  Format ID 10: 1296 x 972 pixels  FOURCC= BGR
  Format ID 11: 1280 x 960 pixels  FOURCC= BGR
  Format ID 12: 1280 x 960 pixels  FOURCC= BGR
  Format ID 13: 1024 x 768 pixels  FOURCC= BGR
  Format ID 14: 1024 x 768 pixels  FOURCC= BGR
  Format ID 15: 1024 x 768 pixels  FOURCC= BGR
  Format ID 16: 800 x 600 pixels  FOURCC= BGR
  Format ID 17: 800 x 600 pixels  FOURCC= BGR
  Format ID 18: 640 x 480 pixels  FOURCC= BGR
  Format ID 19: 648 x 486 pixels  FOURCC= BGR
  Format ID 20: 648 x 486 pixels  FOURCC= BGR
== PlatformStream::open() reveals 21 stream capabilities
== Searching for correct frame buffer mode..
== Looking for 640 480   BGR..
==   2592 x 1944  BGR
==   2048 x 1536  BGR
==   1920 x 1440  BGR
==   1920 x 1080  BGR
==   1600 x 1200  BGR
==   1440 x 1080  BGR
==   1296 x 972  BGR
==   1296 x 972  BGR
==   1296 x 972  BGR
==   1296 x 972  BGR
==   1296 x 972  BGR
==   1280 x 960  BGR
==   1280 x 960  BGR
==   1024 x 768  BGR
==   1024 x 768  BGR
==   1024 x 768  BGR
==   800 x 600  BGR
==   800 x 600  BGR
==   640 x 480  BGR
== Capture format set!
== Could not create IAMCameraControl
== Could not open stream for device  Camera MV-U500#96B5CF08-3
Stream ID = -1
== isOpenStream was called with a negative stream ID
Stream is closed (?)
== Context destroyed

Best regards.

Setup build system to use EC2 runners

EC2 now has support for every platform we build for, including mac-arm64. So, I think it might make sense to rework the build scripts to build on EC2 based Github runners, or maybe just skip the Github runner stuff altogether.

Screenshot 2023-02-15 at 10 50 48 PM

OSX UVC: two cameras with same VID/PID will cause problems

On OSX, two cameras that have the same USB VID/PID will be mis-identified. Only one camera will respond to UVC property updates. This is related to the way the AVFoundation and USB devices are matched using VID/PID only. We need to implement a more unique way of matching AVFoundation cameras and their USB devices, probably through a 'device path' or USB location ID.

Building for Windows with mingw64

I'm trying to get the code compiled for Windows (64-bit, but that should make no difference) using the TDM mingw64 compiler.

Has anyone used the mingw compilers for this code? It's not going very smoothly.

Static linking on Windows

Hello 👋,

thank you for this library! According to my research, this is the only library that can reliable list connected cameras on Windows and macOS and provides an uniform frame format to be processed across platforms. Great!

I want to use openpnp-capture within another library. For this, I prefer to link openpnp-capture statically. I have forked the project and I have changed the CMakeLists.txt accordingly. It works fine for me under macOS. However, using compiling the library and accompanying test using Visual Studio 2022, I am confronted with the following linker errors:

Severity	Code	Description	Project	File	Line	Suppression State	Details
Error	LNK2019	unresolved external symbol __imp_Cap_createContext referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Warning	C4267	'argument': conversion from 'size_t' to 'uint32_t', possible loss of data	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\win\tests\main.cpp	438		
Error	LNK2019	unresolved external symbol __imp_Cap_releaseContext referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_getDeviceCount referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_getDeviceName referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_getDeviceUniqueID referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_getNumFormats referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_getFormatInfo referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_openStream referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_closeStream referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_isOpenStream referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_captureFrame referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_getStreamFrameCount referenced in function "void __cdecl estimateFrameRate(void *,int)" (?estimateFrameRate@@YAXPEAXH@Z)	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_getPropertyLimits referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_setProperty referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_setAutoProperty referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_getProperty referenced in function "void __cdecl showProperty(void *,int,unsigned int)" (?showProperty@@YAXPEAXHI@Z)	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_getAutoProperty referenced in function "void __cdecl showAutoProperty(void *,int,unsigned int)" (?showAutoProperty@@YAXPEAXHI@Z)	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_setLogLevel referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_installCustomLogFunction referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK2019	unresolved external symbol __imp_Cap_getLibraryVersion referenced in function main	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\main.obj	1		
Error	LNK1120	20 unresolved externals	openpnp-capture-test	C:\Users\Raphael\Git\static-openpnp-capture\build\win\tests\Debug\openpnp-capture-test.exe	1		

I had suspected target_link_libraries(openpnp-capture strmiids) (https://github.com/openpnp/openpnp-capture/blob/8badbbae826a578c2d66deecbffb6a2a079f1817/CMakeLists.txt#L89C5-L90C1) as cause of the issue and moved the linking of strmiids into the CMakeLists.txt of the test under win/tests. But the linker error persist. Any idea what I am doing wrongly?

MacOS: When extracting buslocation Unique ID is expected to be exactly 18 chars long

Not sure if it's just me and my luck, but at least for me MacOS 13.1 (Ventura) seems to give Unique IDs with a length of 17 chars... This causes buslocation detection to fail so devices can't be recognized from each other if you happen to have multiple similar cameras connected.

I made a quick & dirty patch to platformcontext.mm that extracts buslocation from 17 char Unique IDs and it seems to work. Maybe the Unique ID should be handled by dropping pid & vid and then using the rest of it as the buslocation? That way the Unique ID lenght woudln't matter...

Other solution that might work (if the id is < 18 chars) is to zeropad the beginning till it is long enough. It will get converted from string to uint32_t so trailing zeros wouldn't matter.

I assume that the Unique ID is stored as an actual number value at some point and the leading zeros are cut off when converting it to string. At least on my case this could be the reason:

ioreg -p IOUSB -l -w 0 | grep Global | grep class
      +-o Global Shutter Camera@02140000  <class IOUSBHostDevice, id 0x1001f0d11, registered, matched, active, busy 0 (18 ms), retain 35>
      +-o Global Shutter Camera@02110000  <class IOUSBHostDevice, id 0x1001f0d2a, registered, matched, active, busy 0 (19 ms), retain 35>

Enough with the speculations, here's the quick & dirty patch :)

        } else if (device.uniqueID.length == 17) {
            std::string locStdStr = std::string(device.uniqueID.UTF8String);

            // sanity check for PID and VID to make sure the unique ID is indeed
            // in the format we expect..
            char pidStr[5];
            char vidStr[5];
            snprintf(pidStr, sizeof(pidStr), "%04x", deviceInfo->m_pid);
            snprintf(vidStr, sizeof(vidStr), "%04x", deviceInfo->m_vid);

            if ((locStdStr.substr(9,4) == std::string(vidStr)) &&
                (locStdStr.substr(13,4) == std::string(pidStr)))
            {
                // format seems to be correct
                NSString *hexString = [device.uniqueID substringWithRange:NSMakeRange(2,7)];
                NSScanner *scanner = [NSScanner scannerWithString:hexString];
                [scanner scanHexInt:&(deviceInfo->m_busLocation)];

                LOG(LOG_DEBUG, "Location : %08X\n", deviceInfo->m_busLocation);
                [scanner dealloc];
                [hexString dealloc];
            }
            else
            {
                LOG(LOG_DEBUG, "VID/PID mismatch!\n");
                LOG(LOG_DEBUG, "Extracted VID %s\n", locStdStr.substr(10,4).c_str());
                LOG(LOG_DEBUG, "Extracted PID %s\n", locStdStr.substr(14,4).c_str());
            }
        }

native MJPEG stream on MAC

Hi I am trying to use a rust binding to openpnp-capture to record video frames from an usb 4k camera on mac (M2). Without any problem I was able to get RGB frames but cannot find out how to access raw jpg images coming from the device. I noticed in the code that he images are decoded at runtime (using turbojpg? ). How can bypass this and get the raw data?

Kind regards,
Marcin

Adjusting camera settings fails on macOS Monterey

Apparently macOS Monterey doesn't like opening & closing the USB control channel...

I've noticed that similar issue was recently fixed for CameraController-project
Itaybre/CameraController@b8c7b47

svenn@MacBook-Pro tests % ./openpnp-capture-test 1
==============================
 OpenPNP Capture Test Program
 OSX 64 bit debug v0.0.22-6-gf9328d4 Mar 10 2022 
==============================
[INFO] Platform context created
2022-03-10 15:35:34.944 openpnp-capture-test[40580:20507881] Already have camera permission
[DBG ] enumerateDevices called
[DBG ] Name : FaceTime HD Camera (Apple Inc.)
[DBG ] Model: FaceTime HD Camera
[DBG ] U ID : FaceTime HD Camera (Apple Inc.) 47B4B64B70674B9CAD2BAE273A71F4B5
OSX Unable to extract vendor ID
OSX Unable to extract product ID
[DBG ] USB      : vid=0000  pid=0000
OSX Unique ID is not exactly 18 characters - wrong format to extract location.
We might have trouble identifying the UVC control interface.
[DBG ] Name : BRIO 4K Stream Edition (Unknown)
[DBG ] Model: UVC Camera VendorID_1133 ProductID_2155
[DBG ] U ID : BRIO 4K Stream Edition (Unknown) 0x2240000046d086b
[DBG ] USB      : vid=046D  pid=086B
OSX Unique ID is not exactly 18 characters - wrong format to extract location.
We might have trouble identifying the UVC control interface.
Number of devices: 2
ID 0 -> FaceTime HD Camera (Apple Inc.)
Unique:  FaceTime HD Camera (Apple Inc.) 47B4B64B70674B9CAD2BAE273A71F4B5
  Number of formats: 7
  Format ID 0: 1920 x 1080 pixels  30 FPS(max)  FOURCC=420v
  Format ID 1: 1280 x 720 pixels  30 FPS(max)  FOURCC=420v
  Format ID 2: 1080 x 1920 pixels  30 FPS(max)  FOURCC=420v
  Format ID 3: 1760 x 1328 pixels  30 FPS(max)  FOURCC=420v
  Format ID 4: 640 x 480 pixels  30 FPS(max)  FOURCC=420v
  Format ID 5: 1328 x 1760 pixels  30 FPS(max)  FOURCC=420v
  Format ID 6: 1552 x 1552 pixels  30 FPS(max)  FOURCC=420v
ID 1 -> BRIO 4K Stream Edition (Unknown)
Unique:  BRIO 4K Stream Edition (Unknown) 0x2240000046d086b
  Number of formats: 41
  Format ID 0: 160 x 120 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 1: 160 x 120 pixels  30 FPS(max)  FOURCC=420v
  Format ID 2: 176 x 144 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 3: 176 x 144 pixels  30 FPS(max)  FOURCC=420v
  Format ID 4: 320 x 180 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 5: 320 x 180 pixels  30 FPS(max)  FOURCC=420v
  Format ID 6: 320 x 240 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 7: 320 x 240 pixels  30 FPS(max)  FOURCC=420v
  Format ID 8: 340 x 340 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 9: 352 x 288 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 10: 352 x 288 pixels  30 FPS(max)  FOURCC=420v
  Format ID 11: 424 x 240 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 12: 424 x 240 pixels  30 FPS(max)  FOURCC=420v
  Format ID 13: 440 x 440 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 14: 480 x 270 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 15: 480 x 270 pixels  30 FPS(max)  FOURCC=420v
  Format ID 16: 640 x 360 pixels  30 FPS(max)  FOURCC=420v
  Format ID 17: 640 x 480 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 18: 640 x 480 pixels  30 FPS(max)  FOURCC=420v
  Format ID 19: 640 x 480 pixels  120 FPS(max)  FOURCC=420v
  Format ID 20: 800 x 448 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 21: 800 x 448 pixels  30 FPS(max)  FOURCC=420v
  Format ID 22: 800 x 600 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 23: 800 x 600 pixels  30 FPS(max)  FOURCC=420v
  Format ID 24: 848 x 480 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 25: 848 x 480 pixels  30 FPS(max)  FOURCC=420v
  Format ID 26: 960 x 540 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 27: 960 x 540 pixels  30 FPS(max)  FOURCC=420v
  Format ID 28: 1024 x 576 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 29: 1024 x 576 pixels  30 FPS(max)  FOURCC=420v
  Format ID 30: 1280 x 720 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 31: 1280 x 720 pixels  30 FPS(max)  FOURCC=420v
  Format ID 32: 1280 x 720 pixels  90 FPS(max)  FOURCC=420v
  Format ID 33: 1600 x 896 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 34: 1600 x 896 pixels  30 FPS(max)  FOURCC=420v
  Format ID 35: 1920 x 1080 pixels  30 FPS(max)  FOURCC=yuvs
  Format ID 36: 1920 x 1080 pixels  30 FPS(max)  FOURCC=420v
  Format ID 37: 1920 x 1080 pixels  60 FPS(max)  FOURCC=420v
  Format ID 38: 2560 x 1440 pixels  30 FPS(max)  FOURCC=420v
  Format ID 39: 3840 x 2160 pixels  30 FPS(max)  FOURCC=420v
  Format ID 40: 4096 x 2160 pixels  30 FPS(max)  FOURCC=420v
[DBG ] Setup for capture format (160 x 120)...
[DBG ] UVCCtrl::findDevice() called
[VERB] USB descriptor:
[VERB]   length    = 00000009
[VERB]   type      = 00000002
[VERB]   totalLen  = 00000CC0
[VERB]   interfaces = 00000005
[VERB] Configuration
[VERB] Interface[VERB]  VIDEO/CONTROL
[VERB] Processing Unit ID: 3
[DBG ] UVCCtrl::createControlInterface: created control interface
[DBG ] Created a UVC control object!
[DBG ] FOURCC = yuvs
Stream ID = 0
Stream is open
[INFO] PlatformStream::getPropertyLimits
[ERR ] sendControlRequest USBInterfaceOpen failed!
[VERB] getMinData failed
[ERR ] sendControlRequest USBInterfaceOpen failed!
[VERB] getMaxData failed
[ERR ] sendControlRequest USBInterfaceOpen failed!
[VERB] getDefault failed
Failed to get exposure limits!
[ERR ] sendControlRequest USBInterfaceOpen failed!
Failed to get exposure!
[VERB] UVCCtrl::getAutoProperty exposure
[ERR ] sendControlRequest USBInterfaceOpen failed!
Failed to get auto exposure!
Captured frames: 30

[INFO] closing stream
[DBG ] Stream::~Stream reports 30 frames captured.
[DBG ] Platform context destroyed
[DBG ] m_captureDevice released
[DBG ] m_captureDevice released
[DBG ] Context destroyed

OpenPNP MacOS 10.14 - Seg fault when starting the stream with Cap_openStream()

I have implemented the openpnp-capture library for both Linux and MacOS. Linux works perfectly as does macOS ARM64 and macOS Ventura x86-64. However, when I test on 10.14 (the earliest macOS that my application supports), I get a seg fault when running Cap_openStream().

I initialise the library in the constructor of my class by using:

Cap_setLogLevel(9) Cap_openStream

Afterwards, in another method, I call

m_stream_id = Cap_openStream(m_ctx, m_camera_id, 0);

On macOS 10.14 the line above causes a segmentation fault. Unfortunately, my debugger is not giving me any further information. I have made absolutely sure that I am building the library with CMAKE_OSX_DEPLOYMENT_TARGET=10.14

Is there any help you can offer?

EDIT:

I have traced the seg to the following function in platfromstream.mm

platformDeviceInfo *dinfo = dynamic_cast<platformDeviceInfo*>(device);

EDIT 2

I have stopped the seg fault by changing dynamic_cast<> to use a C cast (platformDeviceInfo*)device

Not sure why this should have stopped the crash though.

EDIT 3

For anybody is else experiencing this problem, the best solution is to LINK_FLAGS "-Wl,-ld_classic" to set_target_properties() in CMakeLists.txt. Adding the ld_classic statement means that dynamic_cast<> can be used.

Amanda

Permissions based crash on OS X 10.14+

Noticed last night that openpnp-capture was crashing when trying to open a camera on OS X. Seems to be related to the required permissions to use the camera on OS X 10.14+.

==============================
 OpenPNP Capture Test Program
 OSX 64 bit debug v0.0.17 Jan 22 2020 
==============================
Usage: openpnp-capture-test <camera ID> <frame format ID>

..continuing with default camera parameters.

[INFO] Platform context created
2020-01-22 23:38:36.655841-0600 openpnp-capture-test[28601:4534687] authorizationStatusForMediaType 0
2020-01-22 23:38:36.656261-0600 openpnp-capture-test[28601:4534687] authorizationStatusForMediaType 0
[DBG ] enumerateDevices called
2020-01-22 23:38:36.658600-0600 openpnp-capture-test[28601:4535236] [access] This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.

As far as I can tell we need to call:

    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
    } ];

But this requires that the app has an Info.plist, and I think that has to be part of the package that library is used in, rather than the library itself. Continuing to investigate this.

openpnp-capture_Win32.dll v0.0.23 crashes

Using openpnp-capture_Win32.dll v0.0.23 on WIndows 10, when calling Cap_openStream program crashes:

"Declare DLL call caused an exception."

Using openpnp-capture_Win32.dll v0.0.22 the exact same code works with no issues.

I am using the C dll from Visual FoxPro.

Camera Hardware Changes Not Detected On MacOS

On MacOS, the enumerate devices method does not change if the system camera hardware changes (ex. a device is plugged in or unplugged, etc.) and the method is called again.

This functionality does work on windows with DSHOW

If you call Stream::hasNewFrame(), can m_newFrame be undefined?

So if you call Stream::hasNewFrame() before you've captured any frames, what's the value of m_newFrame?

I ran into a 'illegal instruction' when I build this with zig cc, so I guessed what was happening was it was getting caught by one of clang's sanitizers: whatever value m_newFrame is, it shouldn't actually matter, so it runs just fine when you turn off all the sanitizers.

Memory corruption

Compiling with GLIBCXX_ASSERTIONS (basically cheap runtime array length checking) on Fedora 32 using GCC 10 reveals the following issue:

/usr/include/c++/10/bits/stl_vector.h:1042: std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::operator[](std::vector<_Tp, _Alloc>::size_type) [with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>; std::vector<_Tp, _Alloc>::reference = unsigned char&; std::vector<_Tp, _Alloc>::size_type = long unsigned int]: Assertion '__builtin_expect(__n < this->size(), true)' failed.
Aborted (core dumped)

To reproduce, insert add_definitions(-D_GLIBCXX_ASSERTIONS) in the main CMakeLists.txt and run the openpnp-capture-test binary, let it capture some frames and quit by pressing q. You should now see the assertion trace.

Unable to set the exposure

Hello,

While setting the exposure level, I get the following error:

sendControlRequest: Pipe has stalled, error needs to be cleared.

What is the this error and how can I solve it?

Thanks.

An error is reported on windows 11

onecore\com\combase\objact\dllcache.cxx(2322)\combase.dll!00007FFE34ACCE67: (caller: 00007FFE34ACCCB8) ReturnHr(1) tid(72d4) 80040111 ClassFactory 无法供应请求的类
Msg:[Error getting class object for CLSID ({860BB310-5D01-11D0-BD3B-00A0C911CE86}), IID ({00000001-0000-0000-C000-000000000046}) in DLL (C:\Windows\System32\devenum.dll)]
onecore\com\combase\objact\dllcache.cxx(2327)\combase.dll!00007FFE34ACCCED: (caller: 00007FFE34ACCB38) ReturnHr(2) tid(72d4) 80040111 ClassFactory 无法供应请求的类
onecore\com\combase\objact\dllcache.hxx(2124)\combase.dll!00007FFE34ACCAEA: (caller: 00007FFE34ACC9CF) ReturnHr(3) tid(72d4) 80040111 ClassFactory 无法供应请求的类
onecore\com\combase\objact\dllcache.cxx(3093)\combase.dll!00007FFE34ACC9F7: (caller: 00007FFE34ACD98A) ReturnHr(4) tid(72d4) 80040111 ClassFactory 无法供应请求的类

YUV raw data required

most video compress using yuv2 as it's input format. or at least RGB2YUV2 function can be used.

Test fails for built-in Macbook Pro webcamera

It cannot create a UVC control object for the built-in webcamera on my Macbook Pro (High Sierra):

==============================
 OpenPNP Capture Test Program
 OSX 64 bit debug HEAD-HASH-NOTFOUND Mar 26 2018 
==============================
Usage: openpnp-capture-test <camera ID> <frame format ID>

..continuing with default camera parameters.

[DBG ] Platform context created
[DBG ] enumerateDevices called
[DBG ] Name : FaceTime HD Camera (Apple Inc.)
[DBG ] Model: UVC Camera VendorID_1452 ProductID_34304
[DBG ] U ID : FaceTime HD Camera (Apple Inc.) 0x1420000005ac8600
[DBG ] USB      : vid=05AC  pid=8600
[DBG ] Location : 14200000
Number of devices: 1
ID 0 -> FaceTime HD Camera (Apple Inc.)
Unique:  FaceTime HD Camera (Apple Inc.) 0x1420000005ac8600
  Number of formats: 4
  Format ID 0: 640 x 480 pixels  30 FPS(max)  FOURCC=2vuy
  Format ID 1: 1280 x 720 pixels  30 FPS(max)  FOURCC=2vuy
  Format ID 2: 640 x 480 pixels  30 FPS(max)  FOURCC=420v
  Format ID 3: 1280 x 720 pixels  30 FPS(max)  FOURCC=420v
[DBG ] Setup for capture format (640 x 480)...
[DBG ] UVCCtrl::findDevice() called
[DBG ] UVCCtrl::findDevice() Camera control error -536870210
[DBG ] Could not create a UVC control object! -- settings will not be available!
[DBG ] FOURCC = 2vuy
Stream ID = 0
Stream is open
Failed to get exposure limits!
Failed to get exposure!
Failed to get auto exposure!
Captured frames: 1
Captured frames: 2
Captured frames: 3
Captured frames: 4
Captured frames: 5
Captured frames: 6
Captured frames: 7
Captured frames: 8
Captured frames: 9
Captured frames: 10
Captured frames: 11
Captured frames: 12
Captured frames: 13
Captured frames: 14
Captured frames: 15
Captured frames: 16
Captured frames: 17
Captured frames: 18
Captured frames: 19
Captured frames: 20
Captured frames: 21
Captured frames: 22
Captured frames: 23
Captured frames: 24
Captured frames: 25
Captured frames: 26
Captured frames: 27
Captured frames: 28
Captured frames: 29
Captured frames: 30

[INFO] closing stream
[DBG ] Stream::~Stream reports 34 frames captured.
[DBG ] Platform context destroyed
[DBG ] m_captureDevice released
[DBG ] Context destroyed

Conflict with Qt Framework on macOS

Hi

When I use OpenPnp capture for capturing camera on some Mac laptops I receive the crash in Qt Event loop, sometimes even in provided example in repository.
Crash happen in the Qt loop, after creating context by using Cap_createContext().
Usually this is a information about double release of Cococa Event that causes the crash in debug mode.
My Setup:
MacBook Pro 2019, i7-8557U, macOS Catalina

Include linux-arm native binaries in release

I would really like to just host configuration files and not have to have my own copy of openpnp just for this, but as it stands the default instructions fail because linux-arm is not being included in the native binary releases.
I have them built locally, and probably just need a little help organizing things and pushing them up.

High resolution MJPEG on 8MP camera fails with 0x80004005 "Unspecified error"

High resolution MPJEG on 8MP camera fails with 0x80004005 "Unspecified error":

C:\Users\RB\Downloads>openpnp-capture-test.exe 0 3
==============================
 OpenPNP Capture Test Program
 Win 64 bit debug v0.01 Aug 15 2017
==============================
[DBG ] Context created
[DBG ] Enumerating devices
[DBG ] ICreateDevEnum created
[INFO]      -> PATH \\?\usb#vid_05a3&pid_8830&mi_00#6&27d2624d&0&0000#{65e8773d-
8f56-11d0-a3b9-00a0c9223196}\global
[DBG ] enumerateFrameInfo() called
[INFO] Capture pin found!
[INFO] Stream has 40 capabilities.
[INFO] 1600 x 1200  15 fps  24 bpp FOURCC=MJPG
[INFO] 3264 x 2448  15 fps  24 bpp FOURCC=MJPG
[INFO] 2592 x 1944  15 fps  24 bpp FOURCC=MJPG
[INFO] 2048 x 1536  15 fps  24 bpp FOURCC=MJPG
[INFO] 1280 x 960  15 fps  24 bpp FOURCC=MJPG
[INFO] 1024 x 768  30 fps  24 bpp FOURCC=MJPG
[INFO] 800 x 600  30 fps  24 bpp FOURCC=MJPG
[INFO] 640 x 480  30 fps  24 bpp FOURCC=MJPG
[INFO] 320 x 240  30 fps  24 bpp FOURCC=MJPG
[INFO] 1600 x 1200  15 fps  24 bpp FOURCC=MJPG
[INFO] 1600 x 1200  10 fps  16 bpp FOURCC=YUY2
[INFO] 3264 x 2448  2 fps  16 bpp FOURCC=YUY2
[INFO] 2592 x 1944  3 fps  16 bpp FOURCC=YUY2
[INFO] 2048 x 1536  3 fps  16 bpp FOURCC=YUY2
[INFO] 1280 x 960  10 fps  16 bpp FOURCC=YUY2
[INFO] 1024 x 768  10 fps  16 bpp FOURCC=YUY2
[INFO] 800 x 600  30 fps  16 bpp FOURCC=YUY2
[INFO] 640 x 480  30 fps  16 bpp FOURCC=YUY2
[INFO] 320 x 240  30 fps  16 bpp FOURCC=YUY2
[INFO] 1600 x 1200  10 fps  16 bpp FOURCC=YUY2
[INFO] ID 0 -> HD USB Camera
Number of devices: 1
ID 0 -> HD USB Camera
Unique:  HD USB Camera \\?\usb#vid_05a3&pid_8830&mi_00#6&27d2624d&0&0000#{65e877
3d-8f56-11d0-a3b9-00a0c9223196}\global
  Number of formats: 20
  Format ID 0: 1600 x 1200 pixels  FOURCC=MJPG
  Format ID 1: 3264 x 2448 pixels  FOURCC=MJPG
  Format ID 2: 2592 x 1944 pixels  FOURCC=MJPG
  Format ID 3: 2048 x 1536 pixels  FOURCC=MJPG
  Format ID 4: 1280 x 960 pixels  FOURCC=MJPG
  Format ID 5: 1024 x 768 pixels  FOURCC=MJPG
  Format ID 6: 800 x 600 pixels  FOURCC=MJPG
  Format ID 7: 640 x 480 pixels  FOURCC=MJPG
  Format ID 8: 320 x 240 pixels  FOURCC=MJPG
  Format ID 9: 1600 x 1200 pixels  FOURCC=MJPG
  Format ID 10: 1600 x 1200 pixels  FOURCC=YUY2
  Format ID 11: 3264 x 2448 pixels  FOURCC=YUY2
  Format ID 12: 2592 x 1944 pixels  FOURCC=YUY2
  Format ID 13: 2048 x 1536 pixels  FOURCC=YUY2
  Format ID 14: 1280 x 960 pixels  FOURCC=YUY2
  Format ID 15: 1024 x 768 pixels  FOURCC=YUY2
  Format ID 16: 800 x 600 pixels  FOURCC=YUY2
  Format ID 17: 640 x 480 pixels  FOURCC=YUY2
  Format ID 18: 320 x 240 pixels  FOURCC=YUY2
  Format ID 19: 1600 x 1200 pixels  FOURCC=YUY2
[DBG ] PlatformStream::open() reveals 40 stream capabilities
[INFO] Capture format set!
[INFO] Could not get exposure range information
[INFO] Could not get focus range information
[INFO] Could not get Zoom range information
[INFO] Width = 2048, Height = 1536
[INFO] Stream to device HD USB Camera opened
[DBG ] FOURCC = RGB
Stream ID = 0
Stream is open
=== KEY MAPPINGS ===
Press q to exit.
Press + or - to change the exposure.
Press f or g to change the focus.
Press z or x to change the zoom.
Press a or s to change the gain.
Press [ or ] to change the white balance.
Press p to estimate the actual frame rate.
Press w to write the current frame to a PPM file.
Set exposure to -7
Could not get focus limits.
Could not get zoom limits.
Set white balance to 4650
Set gain to 0 (min=0 max=100)
Estimating frame rate..
Frames = 37
Measured fps=18.50
Estimating frame rate..
Frames = 37
Measured fps=18.50
Estimating frame rate..
Frames = 37
Measured fps=18.50
[INFO] closing stream
[INFO] Callback counter = 3210
[DBG ] Stream::~Stream reports 3210 frames captured.
[DBG ] Context destroyed

C:\Users\RB\Downloads>openpnp-capture-test.exe 0 1
==============================
 OpenPNP Capture Test Program
 Win 64 bit debug v0.01 Aug 15 2017
==============================
[DBG ] Context created
[DBG ] Enumerating devices
[DBG ] ICreateDevEnum created
[INFO]      -> PATH \\?\usb#vid_05a3&pid_8830&mi_00#6&27d2624d&0&0000#{65e8773d-
8f56-11d0-a3b9-00a0c9223196}\global
[DBG ] enumerateFrameInfo() called
[INFO] Capture pin found!
[INFO] Stream has 40 capabilities.
[INFO] 1600 x 1200  15 fps  24 bpp FOURCC=MJPG
[INFO] 3264 x 2448  15 fps  24 bpp FOURCC=MJPG
[INFO] 2592 x 1944  15 fps  24 bpp FOURCC=MJPG
[INFO] 2048 x 1536  15 fps  24 bpp FOURCC=MJPG
[INFO] 1280 x 960  15 fps  24 bpp FOURCC=MJPG
[INFO] 1024 x 768  30 fps  24 bpp FOURCC=MJPG
[INFO] 800 x 600  30 fps  24 bpp FOURCC=MJPG
[INFO] 640 x 480  30 fps  24 bpp FOURCC=MJPG
[INFO] 320 x 240  30 fps  24 bpp FOURCC=MJPG
[INFO] 1600 x 1200  15 fps  24 bpp FOURCC=MJPG
[INFO] 1600 x 1200  10 fps  16 bpp FOURCC=YUY2
[INFO] 3264 x 2448  2 fps  16 bpp FOURCC=YUY2
[INFO] 2592 x 1944  3 fps  16 bpp FOURCC=YUY2
[INFO] 2048 x 1536  3 fps  16 bpp FOURCC=YUY2
[INFO] 1280 x 960  10 fps  16 bpp FOURCC=YUY2
[INFO] 1024 x 768  10 fps  16 bpp FOURCC=YUY2
[INFO] 800 x 600  30 fps  16 bpp FOURCC=YUY2
[INFO] 640 x 480  30 fps  16 bpp FOURCC=YUY2
[INFO] 320 x 240  30 fps  16 bpp FOURCC=YUY2
[INFO] 1600 x 1200  10 fps  16 bpp FOURCC=YUY2
[INFO] ID 0 -> HD USB Camera
Number of devices: 1
ID 0 -> HD USB Camera
Unique:  HD USB Camera \\?\usb#vid_05a3&pid_8830&mi_00#6&27d2624d&0&0000#{65e877
3d-8f56-11d0-a3b9-00a0c9223196}\global
  Number of formats: 20
  Format ID 0: 1600 x 1200 pixels  FOURCC=MJPG
  Format ID 1: 3264 x 2448 pixels  FOURCC=MJPG
  Format ID 2: 2592 x 1944 pixels  FOURCC=MJPG
  Format ID 3: 2048 x 1536 pixels  FOURCC=MJPG
  Format ID 4: 1280 x 960 pixels  FOURCC=MJPG
  Format ID 5: 1024 x 768 pixels  FOURCC=MJPG
  Format ID 6: 800 x 600 pixels  FOURCC=MJPG
  Format ID 7: 640 x 480 pixels  FOURCC=MJPG
  Format ID 8: 320 x 240 pixels  FOURCC=MJPG
  Format ID 9: 1600 x 1200 pixels  FOURCC=MJPG
  Format ID 10: 1600 x 1200 pixels  FOURCC=YUY2
  Format ID 11: 3264 x 2448 pixels  FOURCC=YUY2
  Format ID 12: 2592 x 1944 pixels  FOURCC=YUY2
  Format ID 13: 2048 x 1536 pixels  FOURCC=YUY2
  Format ID 14: 1280 x 960 pixels  FOURCC=YUY2
  Format ID 15: 1024 x 768 pixels  FOURCC=YUY2
  Format ID 16: 800 x 600 pixels  FOURCC=YUY2
  Format ID 17: 640 x 480 pixels  FOURCC=YUY2
  Format ID 18: 320 x 240 pixels  FOURCC=YUY2
  Format ID 19: 1600 x 1200 pixels  FOURCC=YUY2
[DBG ] PlatformStream::open() reveals 40 stream capabilities
[INFO] Capture format set!
[INFO] Could not get exposure range information
[INFO] Could not get focus range information
[INFO] Could not get Zoom range information
[ERR ] Error calling RenderStream (HRESULT=80004005)
[ERR ] Could not open stream for device HD USB Camera
Stream ID = -1
[ERR ] isOpenStream was called with a negative stream ID
Stream is closed (?)
[DBG ] Context destroyed

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.