问题
How can I open a single webcam in multiple programs written in openCV
simultaneously. Btw I have attached 3 webcams and all are working fine in any single program of openCV
, but why two program can't use them both, simultaneously?
Is this a restriction or is there any workaround?
回答1:
Yes, this is an intention to restrict
Why? The conceptual view is related to the hardware control layer. Operating system assumes, there are some peripherals, that can be used on-demand, but keeps their context-of-use non-share-able.
As an example, one may assume a USB-mouse. While it can be used within several processes, some reasoning told the architects, it would not be the case one mouse should feed events into more than one-( window )
-framed -context ( Yes, right, a.k.a. process )
Some other peripherals are even instances of both an EventSENSOR
and an EventCOLLECTOR
, USB-Cameras for example can receive and process signals from operating system to re-adjust their physical state ( Pan-Tilt-Zoom as an example ).
The more obvious becomes the 1:1 relation assumption, which is something we may sometimes wish not to have hardcoded there. On the other hand, what would the poor device do, if one process instructs it go-left
and another go-right
at the same time?
Similarly, who would be happy if one USB-mouse will send it's motion and other MMI-interaction events to all currently running processes? At least Drag&Drop UI-navigation policy will become a funny lottery.
Yes, there is a workaround
A simplest "just-enough" scenario includes aCameraControllerPROCESS
which keeps the 1:1 relation with USB-device and has the visual data
-acquisition responsibility. Here nanoseconds matter, so do not spend any CPU_CLK
on anything other but on moving bytes into a buffer. All other processing shall be left on aVisualDataViewConsumerPROCESS
where openCV
may ( and will ) spend tens and hundreds microseconds on it's own.
Plus it has a communication / service provisioning part, which allows other distributed processes, access the acquired visual data
in parallel manner ( in a non-blocking, concurrent view manner, which is a must for distributed soft-real-time processing ).
If one's architecture requires more features or alternatives, this layered approach allows one to add features while retaining both the control and performance overheads within acceptable envelopes.
A good implementation may remain quite smart, fast, low-latency and slim (resources-wise), if one uses ZeroMQ
with it's Zero-Copy inproc:
virtually abstract transport class, where one does lose an almost Zero-Latency as a cost of the trick, but gains an immense power of having a robust, massively-distribute-able one may scale-out beyond one, two, dozen, thousands, ... you name it ... hosts for free
来源:https://stackoverflow.com/questions/33710555/opening-camera-in-multiple-program-in-opencv