Cookbook
Here is a collection of code fragments demonstrating some features of the OpenCV Python bind
Convert an image
>>> import cv >>> im = cv.LoadImageM("building.jpg") >>> print type(im) <type 'cv.cvmat'> >>> cv.SaveImage("foo.png", im)
Resize an image
To resize an image in OpenCV, create a destination image of the appropriate size, then call Re
>>> >>> >>> >>> import cv original = cv.LoadImageM("building.jpg") thumbnail = cv.CreateMat(original.rows / 10, original.cols / 10, cv.CV_8UC3) cv.Resize(original, thumbnail)
Compute the Laplacian
>>> >>> >>> >>> >>> import cv im = cv.LoadImageM("building.jpg", 1) dst = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_16S, 3) laplace = cv.Laplace(im, dst) cv.SaveImage("foo-laplace.png", dst)
Using GoodFeaturesToTrack
To find the 10 strongest corner features in an image, use GoodFeaturesToTrack like this:
>>> import cv >>> img = cv.LoadImageM("building.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE) >>> eig_image = cv.CreateMat(img.rows, img.cols, cv.CV_32FC1) >>> temp_image = cv.CreateMat(img.rows, img.cols, cv.CV_32FC1) >>> for (x,y) in cv.GoodFeaturesToTrack(img, eig_image, temp_image, 10, 0.04, 1.0 ... print "good feature at", x,y good feature at 198.0 514.0 good feature at 791.0 260.0 good feature at 370.0 467.0 good feature at 374.0 469.0 good feature at 490.0 520.0 good feature at 262.0 278.0 good feature at 781.0 134.0 good feature at 3.0 247.0 good feature at 667.0 321.0 good feature at 764.0 304.0
Using GetSubRect
GetSubRect returns a rectangular part of another image. It does this without copying any data.
>>> >>> >>> >>> import cv img = cv.LoadImageM("building.jpg") sub = cv.GetSubRect(img, (60, 70, 32, 32)) cv.SetZero(sub)
# sub is 32x32 patch within img # clear sub to zero, which also cl
Using CreateMat, and accessing an element
>>> import cv >>> mat = cv.CreateMat(5, 5, cv.CV_32FC1) >>> cv.Set(mat, 1.0) >>> mat[3,1] += 0.375 >>> print mat[3,1] 1.375 >>> print [mat[3,i] for i in range(5)] [1.0, 1.375, 1.0, 1.0, 1.0]
ROS image message to OpenCV
See this tutorial: Using CvBridge to convert between ROS images And OpenCV images .
PIL Image to OpenCV
(For details on PIL see the PIL handbook .)
>>> import Image, cv # PIL image >>> pi = Image.open('building.jpg') >>> cv_im = cv.CreateImageHeader(pi.size, cv.IPL_DEPTH_8U, 3) >>> cv.SetData(cv_im, pi.tostring()) >>> print pi.size, cv.GetSize(cv_im) (868, 600) (868, 600) >>> print pi.tostring() == cv_im.tostring() True
OpenCV to PIL Image
>>> import Image, cv >>> cv_im = cv.CreateImage((320,200), cv.IPL_DEPTH_8U, 1) >>> pi = Image.fromstring("L", cv.GetSize(cv_im), cv_im.tostring()) >>> print pi.size (320, 200)
NumPy and OpenCV
Using the array interface , to use an OpenCV CvMat in NumPy:
>>> import cv, numpy >>> mat = cv.CreateMat(3, 5, cv.CV_32FC1) >>> cv.Set(mat, 7) >>> a = numpy.asarray(mat) >>> print a [[ 7. 7. 7. 7. 7.] [ 7. 7. 7. 7. 7.] [ 7. 7. 7. 7. 7.]]
and to use a NumPy array in OpenCV:
>>> >>> >>> >>> 480 >>> 640 import cv, numpy a = numpy.ones((480, 640)) mat = cv.fromarray(a) print mat.rows print mat.cols
also, most OpenCV functions can work on NumPy arrays directly, for example:
>>> picture = numpy.ones((640, 480)) >>> cv.Smooth(picture, picture, cv.CV_GAUSSIAN, 15, 15)
Given a 2D array, the fromarray function (or the implicit version shown above) returns a single size. For a 3D array of size , it returns a CvMat sized with channels. Alternatively, use fromarray with the allowND option to always return a CvMatND .
OpenCV to pygame
To convert an OpenCV image to a pygame surface:
>>> import pygame.image, cv >>> src = cv.LoadImage("lena.jpg") >>> src_rgb = cv.CreateMat(src.height, src.width, cv.CV_8UC3) >>> cv.CvtColor(src, src_rgb, cv.CV_BGR2RGB) >>> pg_img = pygame.image.frombuffer(src_rgb.tostring(), cv.GetSize(src_rgb), "RGB >>> print pg_img <Surface(512x512x24 SW)>
OpenCV and OpenEXR
Using OpenEXRs Python bindings you can make a simple image viewer:
import OpenEXR, Imath, cv filename = "GoldenGate.exr" exrimage = OpenEXR.InputFile(filename) dw = exrimage.header()['dataWindow'] (width, height) = (dw.max.x - dw.min.x + 1, dw.max.y - dw.min.y + 1) def fromstr(s): mat = cv.CreateMat(height, width, cv.CV_32FC1) cv.SetData(mat, s) return mat pt = Imath.PixelType(Imath.PixelType.FLOAT) (r, g, b) = [fromstr(s) for s in exrimage.channels("RGB", pt)] bgr = cv.CreateMat(height, width, cv.CV_32FC3) cv.Merge(b, g, r, None, bgr) cv.ShowImage(filename, bgr) cv.WaitKey()
Help and Feedback
You did not find what you were looking for? Try the Cookbook. Ask a question in the user group/mailing list. If you think something is missing or wrong in the documentation, please file a bug report.