05-15-2024 05:00 AM
Hi,
I want to make an acquisition of image with a camera C920e from logitech in real time to display it as video. It seems to be updating the image with difficulty, very slow, lagging (I guess you know what I mean). I read that it was possible to solve it with low-level functions but I can't find the way to display it as IMAQdx Start Acquisition has session out as strict but displays must be non-strict. Before trying this I tried to use Active Attribute which I also read here (https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z000000PAQ5SAO&l=es-ES) in case it is a frame rate issue but I got an error of
-1074360305 | IMAQdxErrorAttributeNotSupported |
Can you help me with this please?
Thanks!
05-16-2024 02:17 PM
Sigh. I've not done this recently, but if all you want to do is to stream Video from your WebCam to an Image Display on the Front Panel of your VI, you just run the wire from the Camera to the Display and start acquiring.
If you want to broadcast your Video, I believe that might be (significantly) more difficult. I never tried, as the program I was writing was to "Take images and show them to me right now".
I'm running LabVIEW 2019 and 2021, so I couldn't open your VI (saved in LabVIEW 2022). Can you "Save for Previous Version" (unless someone else solves your problem for you)?
Bob Schor
05-16-2024 02:27 PM
Mmmm I believe the word is "stream". The issue is that in the IV it doesn't display the video smoothly so my idea was to change frame rate but they way I found in documentation gave the error I copied in the previous message.
Find attached the 21 version.
05-17-2024 09:53 AM
Thank you for attaching your code saved for LabVIEW 2019. I don't usually do this, but I "fixed" your code, and am going to use it as a "lesson" about LabVIEW coding, and why you should not "byte off more than you can chew", or "Don't try to do things with LabVIEW Vision before you (a) have a good grasp of LabVIEW, (b) can write "reasonably readable" LabVIEW code, and (c) have some experience (via DAQmx) with the "simple" version of LabVIEW I/O with external hardware. LabVIEW Vision is much more difficult, complex, and arcane than DAQmx (my first LabVIEW project was to maintain a large LabVIEW 7 program that used "Traditional DAQ" -- DAQmx is so much simpler!).
Here is a "cleaned up" version of your original code:
The While loop repeatedly starts the Camera, but there is no "Image Acquisition", and the Image is disconnected from everything. [I straightened the wires, made the Diagram more compact, and fit the Front Panel into a reasonable space so you could see all the Controls without needing a second monitor to find the "Stop" button].
Needless to say, this didn't do anything. The control "Session In" is a pointer to an IMAQdx camera, but there is no provision (and I didn't change this!) to look for a Camera, if it finds one, choose it, if it finds none, exit with a "No Camera!" error message, and if it finds more than one, ask "Which camera do you want". In addition, it makes no attempt to query the Camera settings and to set it to something appropriate (more on this later).
If you had experience with DAQmx (and had read "Learn 10 Functions in NI DAQmx and Handle 80 Percent of your Data Acquisition Applications" (do a Web search and you'll find this!), you'd know that for continuous acquisition and display, you need a "Start Something", a While Loop with "Read Something" and either "Show Something" or "Export Something to a parallel loop for Showing or Saving", and a "Stop Something" when the While Loop exits. So let's put the Start IMAQdx outside the While Loop.
If you had experience with DAQmx, you'd know you should not (I was going to say "never", but you should "rarely say never") put a "Wait" function inside an acquisition loop. You want the hardware to control the Loop Speed. One hopes that putting, say, a IMAQdx Grab function inside the loop will (a) acquire an Image, and (b) serve as a "clock" to make the loop run at the frame rate (30 fps) of the Camera. In addition, the "Grab" should give you an "Image Out" which you can wire to your Image.
So here is my VI. I knew it wouldn't work when I tried it, because "Session In" was blank. But I could right-click it, let MAX find my PC's WebCam (called "cam0"), and give it a whirl. Yuck, very, very slow. It was running at some ridiculous number of pixels (1280 x 720?) and at a huge magnification, so I went into MAX, changed the frame rate to 640 x 480, went to the Front Panel and set the Image to "Zoom to fit", and tried again -- unfortunately, I can't do anything about the ugly image that stared back at me and waved back at me when I waved at it, but it worked (now) just fine.
So:
Bob Schor
P.S. -- the above "pictures" are LabVIEW Snippets, a special form of PNG file that can be dropped onto a LabVIEW Block Diagram and magically become LabVIEW code.
05-18-2024 06:59 AM
First of all, thank you for your explanation.
Second, I am doing a project for university which is much more complex than just this. Don't feel as if you were doing my homework, please 😅 It's just a small thing that I tried to do to make it perfect.
I learnt some basics of Labview at a subject but they didn't teach me DAQmx. I wanted to go straightforward to the problem. My original camera loop was this but I tried to change the functions by low-level functions and disconnected the display because it was impossible to attach strict with non-strict. Then, I posted the one you saw which of course doesn't work.
I don't have right now the camera I was using and my webcam seems odd for no reason (reddish color and light blue the background) but the problem I wanted to solve was the speed. If I opened the camera in Windows it worked fine but the image acquisition was lagged. How did you change the frame rate in the code? I couldn't find it and I still don't know from your reply how to do it. Let me show the original snippet I was working in before I posted the code you saw in this query. As you can see, I already changed the resolution (not the frame rate) to make smaller the image of the camera.
Once again, thank you so much and sorry for bothering.
05-18-2024 09:29 PM
Hello, Bits and Science.
First, you never need to apologize for giving an academician an opportunity to teach.
Just below my Snippet, I mention that I used MAX to set the Image Size and Frame Rate.
When you say you changed the resolution of the Image, in fact, you only changed the number of pixels you extracted from the Image. I'm guessing the default Image in MAX was way higher (maybe a factor of 8 or 16), and you were only visualizing 10% of the Image (probably the upper left corner) -- the camera was sending you a BIG picture (with lots and lots of pixels), which was all being stored in PC memory (in a Camera "Buffer"), which is where the time went. Try my steps to get MAX to change the Buffer size, and you should be happier.
(Professor) Bob Schor
05-22-2024 04:54 AM
Hi Bob,
I didn't understand what you meant. Now I have changed the settings in MAX as you said but I see no difference in frame rate. The image still wobbles when I move my fingers in front of the camera. I fixed the image size but it does what I say. Probably it's my computer or the camera.
Anyway, thank you so much 😉
Carlos
05-22-2024 05:28 AM
Does your computer have a Camera (for Teams, WebEx, Zoom, etc.)? That should be using the GenICam standards that work with IMAQdx. Note you do need the IMAQdx driver, not IMAQ ...
Bob Schor
05-22-2024 05:40 AM
Yes, it has a camera. But for the application I was implementing I needed a better one to point to an experiment, so that's why I picked an external one. It's a C920e from logitech.
Carlos
05-22-2024 05:57 AM
Try with the Webcam. Did you open your C920 camera in MAX and adjust the image size to 640 x 480, 30 FPS?
Bob Schor