Capturing a video with video capture card, opencv - opencv

I am using the following piece of code to capture video from a camera connected to a video capture card.
int main() {
cv::VideoCapture cap(2);
if(!cap.isOpened())
{
std::cerr << "ERROR: Could not open camera." << std::endl;
return -1;
}
cv::Mat frame;
while(1){
cap >> frame;
cv::imshow("frame",frame);
cvWaitKey(10);
}
}
When I use my usb webcams there is no problem and the code works perfectly. However, with the video capture card, I don't see the any video stream! There is no error as well! When I put a break point inside the loop, I can see the video after a couple of iterations. At first I thought this problem is related to the delay and increased the wait time ,i.e., cvWaitKey(30) but that also didn't help. The only way it works is with break point! I don't understand what is special about the break point!
Please please help! I have to use this video capture card and want to make an executable file from this code which doesn't work without break points!!! Any comment is appreciated.
NOTE: I am using Windows.

Related

Unity/Videoplayer - Game sometimes crash if I load next video

I use Video Player which attached 3D game object. This game object contain "Mesh Renderer" component too. Video Player Renderer-> this game object.
I try many method, but always crash game.
I try use in Update: Videoplayer().isplaying if false, then I load from Resources next video and play, but not working. (Unity Editor working fine, but in iPhone sometimes crash game.)
Then I try other method..
But sometimes crash too..
Okey, I think maybe loading and start playing too fast, maybe this cause the crash.
Then I try use Ienumerator waitforsecond every step, for debugging I set it 5 seconds.
I try first set video player.clip = null, maybe this is the problem.. But not..
Now the code:
void Start()
{
index = 0;
videoPlayer = gameObject.GetComponent<VideoPlayer>();
videoPlayer.loopPointReached += CheckOver;
}
IEnumerator Waitforseconds()
{
Debug.Log("Waitforseconds start");
videoPlayer.clip = null;
Debug.Log("Videoplayer clip null);
yield return new WaitForSeconds(5);
videoPlayer.clip = theVideo;
Debug.Log("Videoplayer set the video");
yield return new WaitForSeconds(5);
Debug.Log("Next play video player");
videoPlayer.Play();
Debug.Log("Play video player");
isPlaying = true;
}
void CheckOver(UnityEngine.Video.VideoPlayer vp)
{
Debug.Log("Checkover");
index += 1;
if (index >= videos.Length)
{
index = 0;
}
theVideo = videos[index];
Debug.Log("Set the video");
StartCoroutine(Waitforseconds());
}
The videos size 5-10 MB and 10-60 seconds.
The result: Unity Editor working good, I build to iOS and sometimes crash the game if I play next video (iPhone 12 Pro Max, supposedly the fastest smartphone chip, so if that doesn't work, there's a big problem..)
Debug:
I get last Debug.log before the game crash:
"Videoplayer clip null"
So I think the game crash here: videoPlayer.clip = theVideo;
But only iOS! Unity editor working good.
Xcode error:
I try find solution in google, but I can't find..
Maybe memory error? should I somehow delete the previous video from memory?
Or how can I solve this problem? Please help me.
Thank you very much!
EDIT: I see the problem is Audio. (Audio Output mode: Audio Source, this component attached to same gameobject. So same game object contain audio source and video player.) If I set Audio Output mode to "none", then game not crash, workin good. So the problem when "PrepareAudioTap". How can I solve this problem?
Solved!
I change Video Player component "Audio Output mode": Audio Source to Direct.
Then not crash game.
But I would like to use Audio Source, because I need 3D Sound. (not important, I'm glad it works, but if you have idea how to work with 3D sound, I would be glad.)
Thanks!

OpenCV on Ubuntu: I can't use video capture to read video files

I am trying to VideoCapture video files using the following code:
VideoCapture cap("input.avi");
if(!cap.isOpened()){
cout << "Cannot open the video" << endl;
return-1;
}
However the output is always "Cannot open the video", meaning that I can't read this video. (I am sure I put the video file in a correct deritory)
But I am able to VideoCapture from a real-time camera successfully using
VideoCapture cap(0);
Why this happens? How can I fix it because I really need to read video files instead of real-time camera.
THX!

Capturing through a single multi-head (stereo) camera using OpenCV

I have a single multi-head (stereo) usb camera that can be detected and can stream stereo videos using the "Video Capture Sources" filter in GraphEdit .
I'm trying to access both channels using OpenCV2.4.8 (on PC that has VS2010, Win7 X64) for further stereo image processing. However, I can only detect/stream single head(channel) of the camera and not both stereo heads of it. My code is set according to the related documentation notes of VideoCapture::grab/VideoCapture::retrieve and looks like the following:
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int, char**)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat Lframe,Rframe;
namedWindow("Lframe",CV_WINDOW_AUTOSIZE);namedWindow("Rframe",CV_WINDOW_AUTOSIZE);
while(char(waitKey(1)) != 'q') {
if(cap.grab())
cap.retrieve(Lframe,0); cap.retrieve(Rframe,1);// get a new frame
imshow("Lframe",Lframe);imshow("Rframe",Rframe);
if(waitKey(30) >= 0) break;
}
return 0;
}
The problem is that the rendered channels (Lframe,Rframe) are identical no matter which Channel index is passed. Hence, only certain head is accessed & I can't get stereo streaming.
Is there a way to use "Video Capture Sources" filter directly with OpenCV?
Waiting for your assistance & Thank you in advance,

Opencv, with video capture card, grabs frames only when a break point is set in the c++ code

Capturing a video with video capture card, opencv
The above question pretty much asks what i want to. I have an elgato (elgato video capture http://www.elgato.com/video/video-capture) frame grabber which has USB 2.0 interface. I am trying to use opencv to grab the frames from the elgato frame grabber. Frame grabbing is happening inside a while loop as shown below.
grabSuccess = ( cvGrabFrame (captureDev[0]) == 1 );
frameGrabbed = (grabSuccess ? cvRetrieveFrame (captureDev[0]) : NULL);
while (1)
{
grabSuccess = ( cvGrabFrame (captureDev[0]) == 1);
frameGrabbed = (grabSuccess ? cvRetrieveFrame (captureDev[0]) : NULL);
.
.
.
//some processing
.
.
.
//show image here
}
when I set a break point before the loop and continue the execution after the debugger stops at the break point. Everything works fine( video frames are displayed in cvWindow).
But without the break-point interrupt , I see a blank grayed out window.
Any help would be appreciated.
P:S: I am developing using visual studio 2012 express in windows 8 with opencv 2.3.1 ,
elgato specification are as follows:
1) Video resolution: 640×480 (4:3) or 640×360 (16:9)
2) Video format PC Software: H.264 at 1.4 MBit/sec
Add
cv::waitKey(1);
After the code line to show the image in a window.
cv::waitKey() tells the computer to wait for some time (1ms here) to render the image in a window. cv::waitKey() is very similar to _getch(), which waits for the user to input a key.

Can't access webcam with OpenCV

I'm using OpenCV 2.2 with visual studio 2010 on a win 7 64 bit pc.
I'm able to display pictures and play AVI files through OpenCV as given in the book "Learning OpenCV" but I'm not able to capture webcam images. Even the samples given along with the OpenCV files cant access the webcam.
I get asked for " video source -> capture source" and there are two options: HP webcam Splitter and HP webcam. If I select HP webcam the window closes immediately without displaying any error. (i think any error message is too fast to be seen before it closes). If I select HP Webcam splitter then the new window, where the webcam images(video) are supposed to come, is filled with uniform gray. The webcam LED is on but no video is seen. My webcam works fine with flash (www.testmycam.com) and with DirectShow http://www.codeproject.com/KB/audio-video/WebcamUsingDirectShowNET.aspx
I did try getting some error message by using this:
#include "cv.h"
#include "highgui.h"
#include <iostream>
using namespace cv;
using namespace std;
int main(int, char**)
{
VideoCapture cap("0"); // open the default camera
if(!cap.isOpened()) // check if we succeeded
{
cout << "Error opening camera!";
getchar();
return -1;
}
Mat edges;
namedWindow("edges",1);
for(;;)
{
Mat frame;
cap >> frame; // get a new frame from camera
cvtColor(frame, edges, CV_BGR2GRAY);
GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);
imshow("edges", edges);
if(waitKey(30) >= 0) break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}
And the error message I got was:
warning: Error opening file (C:\Users\vp\work\ocv\opencv\modules\highgui\src\cap
_ffmpeg.cpp:454)
Error opening camera!
I don't know what this "cap_ffmpeg.cpp" is and I don't know if this is any issue with the nosy "HP Media Smart" stuff.
Any help will be greatly appreciated.
I had the same issue on Windows 7 64-bit. I had to recompile opencv_highgui changing the "Preprocesser Definitions" in the C/C++ panel of the properties page to include:
HAVE_VIDEOINPUT
HAVE_DSHOW
Hope this helps
The cap_ffmpeg.cpp is the source file which uses ffmpeg to perform capturing of the device. If the default example given from OpenCV doesn't work with your webcam, you are out of luck. I suggest you buy another one that is supported.
Recently I have installed OpenCV 2.2 and NetBeans 6.9.1. I had a problem with camera capture, the image in the window was black but the program runs perfectly, without errors. I had to run NetBeans as admin user to fix this problem.
I hope this can help you all.
I just switched to OpenCV 2.2 and am having essentially the same problem but a 32 bit compture running Vista. The webcam would start but I'd get an error message setting the width property for the camera. If I specifically request the DirectShow camera, the cvCreateCameraCapture would fail.
What I think is going on is that the distribution version of HighGUI was build excluding the DirectShow camera. The favored Windows camera on OpenCV used to be Video For Windows, VFW but that has been deprecated since Windows Vista came out and has created all sorts of problems. Why they don't just include it, I don't know. Check the source file cap.cpp
My next step is to rebuild HighGUI myself and make sure the flag HAVE_DSHOW is set. I seem to remember having the same problem with the last version of OpenCV I've been using until I rebuilt it making sure the DirectShow version was enabled.
I experienced the same problem. My Vaio Webcam LED is on but no image on the screen.
Then I tried to export the first frame to a JPEG file and its working. Then I tried to insert a delay of 33ms before capture any frame, this time it works like a charm. Hope this'll help.
Here's an article I wrote some time back. It uses the videoInput library to get input from webcams. It uses DirectX, so it works with almost every webcam out there. Capturing images with DirectX
Once you create the cv::VideoCapture you should give an integer not a string (since string implies the input is a file).
To open the default camera, open the stream with
cv::VideoCapture capture(0);
and it will work fine.
CMAKE GUI, MSVC++10E, Vista 32bit, OpenCV2.2
It looks like HAVE_VIDEOINPUT/WITH_VIDEOINPUT option doesn't work.
However adding: /D HAVE_DSHOW /D HAVE_VIDEOINPUT to CMAKE_CXX_FLAGS, and CMAKE_C_FLAGS did the trick for me (there will be warns due to macro redefinitions).

Resources