-
-
Save jayrambhia/5866483 to your computer and use it in GitHub Desktop.
| #include <errno.h> | |
| #include <fcntl.h> | |
| #include <linux/videodev2.h> | |
| #include <stdint.h> | |
| #include <stdio.h> | |
| #include <string.h> | |
| #include <sys/ioctl.h> | |
| #include <sys/mman.h> | |
| #include <unistd.h> | |
| #include <opencv2/core/core.hpp> | |
| #include <opencv2/highgui/highgui.hpp> | |
| uint8_t *buffer; | |
| static int xioctl(int fd, int request, void *arg) | |
| { | |
| int r; | |
| do r = ioctl (fd, request, arg); | |
| while (-1 == r && EINTR == errno); | |
| return r; | |
| } | |
| int print_caps(int fd) | |
| { | |
| struct v4l2_capability caps = {}; | |
| if (-1 == xioctl(fd, VIDIOC_QUERYCAP, &caps)) | |
| { | |
| perror("Querying Capabilities"); | |
| return 1; | |
| } | |
| printf( "Driver Caps:\n" | |
| " Driver: \"%s\"\n" | |
| " Card: \"%s\"\n" | |
| " Bus: \"%s\"\n" | |
| " Version: %d.%d\n" | |
| " Capabilities: %08x\n", | |
| caps.driver, | |
| caps.card, | |
| caps.bus_info, | |
| (caps.version>>16)&&0xff, | |
| (caps.version>>24)&&0xff, | |
| caps.capabilities); | |
| struct v4l2_cropcap cropcap = {0}; | |
| cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | |
| if (-1 == xioctl (fd, VIDIOC_CROPCAP, &cropcap)) | |
| { | |
| perror("Querying Cropping Capabilities"); | |
| return 1; | |
| } | |
| printf( "Camera Cropping:\n" | |
| " Bounds: %dx%d+%d+%d\n" | |
| " Default: %dx%d+%d+%d\n" | |
| " Aspect: %d/%d\n", | |
| cropcap.bounds.width, cropcap.bounds.height, cropcap.bounds.left, cropcap.bounds.top, | |
| cropcap.defrect.width, cropcap.defrect.height, cropcap.defrect.left, cropcap.defrect.top, | |
| cropcap.pixelaspect.numerator, cropcap.pixelaspect.denominator); | |
| int support_grbg10 = 0; | |
| struct v4l2_fmtdesc fmtdesc = {0}; | |
| fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | |
| char fourcc[5] = {0}; | |
| char c, e; | |
| printf(" FMT : CE Desc\n--------------------\n"); | |
| while (0 == xioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc)) | |
| { | |
| strncpy(fourcc, (char *)&fmtdesc.pixelformat, 4); | |
| if (fmtdesc.pixelformat == V4L2_PIX_FMT_SGRBG10) | |
| support_grbg10 = 1; | |
| c = fmtdesc.flags & 1? 'C' : ' '; | |
| e = fmtdesc.flags & 2? 'E' : ' '; | |
| printf(" %s: %c%c %s\n", fourcc, c, e, fmtdesc.description); | |
| fmtdesc.index++; | |
| } | |
| /* | |
| if (!support_grbg10) | |
| { | |
| printf("Doesn't support GRBG10.\n"); | |
| return 1; | |
| }*/ | |
| struct v4l2_format fmt = {0}; | |
| fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | |
| fmt.fmt.pix.width = 640; | |
| fmt.fmt.pix.height = 480; | |
| //fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_BGR24; | |
| //fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_GREY; | |
| fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; | |
| fmt.fmt.pix.field = V4L2_FIELD_NONE; | |
| if (-1 == xioctl(fd, VIDIOC_S_FMT, &fmt)) | |
| { | |
| perror("Setting Pixel Format"); | |
| return 1; | |
| } | |
| strncpy(fourcc, (char *)&fmt.fmt.pix.pixelformat, 4); | |
| printf( "Selected Camera Mode:\n" | |
| " Width: %d\n" | |
| " Height: %d\n" | |
| " PixFmt: %s\n" | |
| " Field: %d\n", | |
| fmt.fmt.pix.width, | |
| fmt.fmt.pix.height, | |
| fourcc, | |
| fmt.fmt.pix.field); | |
| return 0; | |
| } | |
| int init_mmap(int fd) | |
| { | |
| struct v4l2_requestbuffers req = {0}; | |
| req.count = 1; | |
| req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | |
| req.memory = V4L2_MEMORY_MMAP; | |
| if (-1 == xioctl(fd, VIDIOC_REQBUFS, &req)) | |
| { | |
| perror("Requesting Buffer"); | |
| return 1; | |
| } | |
| struct v4l2_buffer buf = {0}; | |
| buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | |
| buf.memory = V4L2_MEMORY_MMAP; | |
| buf.index = 0; | |
| if(-1 == xioctl(fd, VIDIOC_QUERYBUF, &buf)) | |
| { | |
| perror("Querying Buffer"); | |
| return 1; | |
| } | |
| buffer = mmap (NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset); | |
| printf("Length: %d\nAddress: %p\n", buf.length, buffer); | |
| printf("Image Length: %d\n", buf.bytesused); | |
| return 0; | |
| } | |
| int capture_image(int fd) | |
| { | |
| struct v4l2_buffer buf = {0}; | |
| buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | |
| buf.memory = V4L2_MEMORY_MMAP; | |
| buf.index = 0; | |
| if(-1 == xioctl(fd, VIDIOC_QBUF, &buf)) | |
| { | |
| perror("Query Buffer"); | |
| return 1; | |
| } | |
| if(-1 == xioctl(fd, VIDIOC_STREAMON, &buf.type)) | |
| { | |
| perror("Start Capture"); | |
| return 1; | |
| } | |
| fd_set fds; | |
| FD_ZERO(&fds); | |
| FD_SET(fd, &fds); | |
| struct timeval tv = {0}; | |
| tv.tv_sec = 2; | |
| int r = select(fd+1, &fds, NULL, NULL, &tv); | |
| if(-1 == r) | |
| { | |
| perror("Waiting for Frame"); | |
| return 1; | |
| } | |
| if(-1 == xioctl(fd, VIDIOC_DQBUF, &buf)) | |
| { | |
| perror("Retrieving Frame"); | |
| return 1; | |
| } | |
| printf ("saving image\n"); | |
| IplImage* frame; | |
| CvMat cvmat = cvMat(480, 640, CV_8UC3, (void*)buffer); | |
| frame = cvDecodeImage(&cvmat, 1); | |
| cvNamedWindow("window",CV_WINDOW_AUTOSIZE); | |
| cvShowImage("window", frame); | |
| cvWaitKey(0); | |
| cvSaveImage("image.jpg", frame, 0); | |
| return 0; | |
| } | |
| int main() | |
| { | |
| int fd; | |
| fd = open("/dev/video0", O_RDWR); | |
| if (fd == -1) | |
| { | |
| perror("Opening video device"); | |
| return 1; | |
| } | |
| if(print_caps(fd)) | |
| return 1; | |
| if(init_mmap(fd)) | |
| return 1; | |
| int i; | |
| for(i=0; i<5; i++) | |
| { | |
| if(capture_image(fd)) | |
| return 1; | |
| } | |
| close(fd); | |
| return 0; | |
| } |
Is there a newer version of this code that would work with OpenCV 4.2.0? The lines 183 to 189 use older named functions and I can't for the life of me find out what the newer function names are called. Any pointers would be great, thanks!!
Dan
Is there a newer version of this code that would work with OpenCV 4.2.0? The lines 183 to 189 use older named functions and I can't for the life of me find out what the newer function names are called. Any pointers would be great, thanks!!
Dan
Lines 183 to 189 change to:
cv::_InputArray pic_arr(buffer, IMAGEWIDTH * IMAGEHEIGHT * 3);
cv::Mat out_img = cv::imdecode(pic_arr, cv::IMREAD_UNCHANGED);
imshow("view", out_img);
imwrite("output.jpg",out_img);
waitKey(0);
Hi, I created a repo that supports OpenCV4:
how to handle this code for multiple device profiles while the camera is same. i.e different configurations of the snapshot requested from client side. I am sending a HTTP GET request from the client side to retrieve the image from server side for multiple device profiles while the camera is single. On first request I am getting the output but on second request my server is throwing "device or resource busy error." How can I make this thread safe. Please provide your suggestions. I am ready to provide more input if someone can help.
Sorry im late, im come from y2023.
Now the weather good, openCV ver 4.7.
Just want say thank all above.
Hi I need an urgent help. I am trying to install Video4Linux 2 driver so that I can run this code. Can you give me the commands for installing this driver in Ubuntu 16.04? I need it very urgently