#Send image data to v4l2loopback using python #Remember to do sudo modprobe v4l2loopback first! #Released under CC0 by Tim Sheerman-Chase, 2013 import fcntl, sys, os from v4l2 import * import time import scipy.misc as misc import numpy as np def ConvertToYUYV(sizeimage, bytesperline, im): padding = 4096 buff = np.zeros((sizeimage+padding, ), dtype=np.uint8) imgrey = im[:,:,0] * 0.299 + im[:,:,1] * 0.587 + im[:,:,2] * 0.114 Pb = im[:,:,0] * -0.168736 + im[:,:,1] * -0.331264 + im[:,:,2] * 0.5 Pr = im[:,:,0] * 0.5 + im[:,:,1] * -0.418688 + im[:,:,2] * -0.081312 for y in range(imgrey.shape[0]): #Set lumenance cursor = y * bytesperline + padding for x in range(imgrey.shape[1]): try: buff[cursor] = imgrey[y, x] except IndexError: pass cursor += 2 #Set color information for Cb cursor = y * bytesperline + padding for x in range(0, imgrey.shape[1], 2): try: buff[cursor+1] = 0.5 * (Pb[y, x] + Pb[y, x+1]) + 128 except IndexError: pass cursor += 4 #Set color information for Cr cursor = y * bytesperline + padding for x in range(0, imgrey.shape[1], 2): try: buff[cursor+3] = 0.5 * (Pr[y, x] + Pr[y, x+1]) + 128 except IndexError: pass cursor += 4 return buff.tostring() if __name__=="__main__": devName = '/dev/video2' if len(sys.argv) >= 2: devName = sys.argv[1] width = 640 height = 512 if not os.path.exists(devName): print "Warning: device does not exist",devName device = open(devName, 'wr') print(device) capability = v4l2_capability() print "get capabilities result", (fcntl.ioctl(device, VIDIOC_QUERYCAP, capability)) print "capabilities", hex(capability.capabilities) fmt = V4L2_PIX_FMT_YUYV #fmt = V4L2_PIX_FMT_YVU420 print("v4l2 driver: " + capability.driver) format = v4l2_format() format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT format.fmt.pix.pixelformat = fmt format.fmt.pix.width = width format.fmt.pix.height = height format.fmt.pix.field = V4L2_FIELD_NONE format.fmt.pix.bytesperline = width * 2 format.fmt.pix.sizeimage = width * height * 2 format.fmt.pix.colorspace = V4L2_COLORSPACE_JPEG print "set format result", (fcntl.ioctl(device, VIDIOC_S_FMT, format)) #Note that format.fmt.pix.sizeimage and format.fmt.pix.bytesperline #may have changed at this point #Create image buffer im = misc.imread("Lenna.png") buff = ConvertToYUYV(format.fmt.pix.sizeimage, format.fmt.pix.bytesperline, im) while True: device.write(buff) time.sleep(1./30.)