1. Trang chủ
  2. » Công Nghệ Thông Tin

O’Reilly Learning OpenCV phần 3 doc

57 452 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 57
Dung lượng 3,56 MB

Nội dung

100 | Chapter 4: HighGUI trackbars for all of the usual things one might do with a slider as well as many unusual ones (see the next section, “No Buttons”)! As with the parent window, the slider is given a unique name (in the form of a character string) and is therea er always referred to by that name.  e HighGUI routine for cre- ating a trackbar is: int cvCreateTrackbar( const char* trackbar_name, const char* window_name, int* value, int count, CvTrackbarCallback on_change );  e  rst two arguments are the name for the trackbar itself and the name of the parent window to which the trackbar will be attached. When the trackbar is created it is added to either the top or the bottom of the parent window;* it will not occlude any image that is already in the window.  e next two arguments are value, a pointer to an integer that will be set automatically to the value to which the slider has been moved, and count, a numerical value for the maximum value of the slider.  e last argument is a pointer to a callback function that will be automatically called whenever the slider is moved.  is is exactly analogous to the callback for mouse events. If used, the callback function must have the form CvTrackbarCallback, which is de ned as: void (*callback)( int position )  is callback is not actually required, so if you don’t want a callback then you can sim- ply set this value to NULL. Without a callback, the only e ect of the user moving the slider will be the value of *value being changed. Finally, here are two more routines that will allow you to programmatically set or read the value of a trackbar if you know its name: int cvGetTrackbarPos( const char* trackbar_name, const char* window_name ); void cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos );  ese functions allow you to set or read the value of a trackbar from anywhere in your program. * Whether it is added to the top or bottom depends on the operating system, but it will always appear in the same place on any given platform. 04-R4886-RC1.indd 10004-R4886-RC1.indd 100 9/15/08 4:19:26 PM9/15/08 4:19:26 PM Displaying Images | 101 No Buttons Unfortunately, HighGUI does not provide any explicit support for buttons. It is thus common practice, among the particularly lazy,* to instead use sliders with only two positions. Another option that occurs o en in the OpenCV samples in …/opencv/ samples/c/ is to use keyboard shortcuts instead of buttons (see, e.g., the  ood ll demo in the OpenCV source-code bundle). Switches are just sliders (trackbars) that have only two positions, “on” (1) and “o ” (0) (i.e., count has been set to 1). You can see how this is an easy way to obtain the func- tionality of a button using only the available trackbar tools. Depending on exactly how you want the switch to behave, you can use the trackbar callback to automatically reset the button back to 0 (as in Example 4-2; this is something like the standard behavior of most GUI “buttons”) or to automatically set other switches to 0 (which gives the e ect of a “radio button”). Example 4-2. Using a trackbar to create a “switch” that the user can turn on and o // We make this value global so everyone can see it. // int g_switch_value = 0; // This will be the callback that we give to the // t r a ck b a r. // void switch_callback( int position ) { if( position == 0 ) { switch_off_function(); } else { switch_on_function(); } } int main( int argc, char* argv[] ) { // Name the main window // cvNamedWindow( “Demo Window”, 1 ); // Create the trackbar. We give it a name, // and tell it the name of the parent window. // cvCreateTrackbar( “Switch”, “Demo Window”, &g_switch_value, 1, * For the less lazy, another common practice is to compose the image you are displaying with a “control panel” you have drawn and then use the mouse event callback to test for the mouse’s location when the event occurs. When the (x, y) location is within the area of a button you have drawn on your control panel, the callback is set to perform the button action. In this way, all “buttons” are internal to the mouse event callback routine associated with the parent window. 04-R4886-RC1.indd 10104-R4886-RC1.indd 101 9/15/08 4:19:27 PM9/15/08 4:19:27 PM 102 | Chapter 4: HighGUI Switch_callback ); // This will just cause OpenCV to idle until // someone hits the “Escape” key. // while( 1 ) { if( cvWaitKey(15)==27 ) break; } } You can see that this will turn on and o just like a light switch. In our example, whenever the trackbar “switch” is set to 0, the callback executes the function switch_off_ function() , and whenever it is switched on, the switch_on_function() is called. Working with Video When working with video we must consider several functions, including (of course) how to read and write video  les. We must also think about how to actually play back such  les on the screen.  e  rst thing we need is the CvCapture device.  is structure contains the information needed for reading frames from a camera or video  le. Depending on the source, we use one of two di erent calls to create and initialize a CvCapture structure. CvCapture* cvCreateFileCapture( const char* filename ); CvCapture* cvCreateCameraCapture( int index ); In the case of cvCreateFileCapture(), we can simply give a  lename for an MPG or AVI  le and OpenCV will open the  le and prepare to read it. If the open is successful and we are able to start reading frames, a pointer to an initialized CvCapture structure will be returned. A lot of people don’t always check these sorts of things, thinking that nothing will go wrong. Don’t do that here.  e returned pointer will be NULL if for some reason the  le could not be opened (e.g., if the  le does not exist), but cvCreateFileCapture() will also return a NULL pointer if the codec with which the video is compressed is not known.  e subtleties of compression codecs are beyond the scope of this book, but in general you will need to have the appropriate library already resident on your computer in or- der to successfully read the video  le. For example, if you want to read a  le encoded with DIVX or MPG4 compression on a Windows machine, there are speci c DLLs that provide the necessary resources to decode the video.  is is why it is always important to check the return value of cvCreateFileCapture(), because even if it works on one ma- chine (where the needed DLL is available) it might not work on another machine (where that codec DLL is missing). Once we have the CvCapture structure, we can begin reading frames and do a number of other things. But before we get into that, let’s take a look at how to capture images from a camera. Example 4-2. Using a trackbar to create a “switch” that the user can turn on and o (continued) 04-R4886-RC1.indd 10204-R4886-RC1.indd 102 9/15/08 4:19:27 PM9/15/08 4:19:27 PM Working with Video | 103  e routine cvCreateCameraCapture() works very much like cvCreateFileCapture() ex- cept without the headache from the codecs.* In this case we give an identi er that indi- cates which camera we would like to access and how we expect the operating system to talk to that camera. For the former, this is just an identi cation number that is zero (0) when we only have one camera, and increments upward when there are multiple cam- eras on the same system.  e other part of the identi er is called the domain of the camera and indicates (in essence) what type of camera we have.  e domain can be any of the prede ned constants shown in Table 4-3. Table 4-3. Camera “domain” indicates where HighGUI should look for your camera Camera capture constant Numerical value CV_CAP_ANY 0 CV_CAP_MIL 100 CV_CAP_VFW 200 CV_CAP_V4L 200 CV_CAP_V4L2 200 CV_CAP_FIREWIRE 300 CV_CAP_IEEE1394 300 CV_CAP_DC1394 300 CV_CAP_CMU1394 300 When we call cvCreateCameraCapture(), we pass in an identi er that is just the sum of the domain index and the camera index. For example: CvCapture* capture = cvCreateCameraCapture( CV_CAP_FIREWIRE ); In this example, cvCreateCameraCapture() will attempt to open the  rst (i.e., number- zero) Firewire camera. In most cases, the domain is unnecessary when we have only one camera; it is su cient to use CV_CAP_ANY (which is conveniently equal to 0, so we don’t even have to type that in). One last useful hint before we move on: you can pass -1 to cvCreateCameraCapture(), which will cause OpenCV to open a window that allows you to select the desired camera. Reading Video int cvGrabFrame( CvCapture* capture ); IplImage* cvRetrieveFrame( CvCapture* capture ); IplImage* cvQueryFrame( CvCapture* capture ); Once you have a valid CvCapture object, you can start grabbing frames.  ere are two ways to do this. One way is to call cvGrabFrame(), which takes the CvCapture* pointer and returns an integer.  is integer will be 1 if the grab was successful and 0 if the grab * Of course, to be completely fair, we should probably confess that the headache caused by di erent codecs has been replaced by the analogous headache of determining which cameras are (or are not) supported on our system. 04-R4886-RC1.indd 10304-R4886-RC1.indd 103 9/15/08 4:19:27 PM9/15/08 4:19:27 PM 104 | Chapter 4: HighGUI failed.  e cvGrabFrame() function copies the captured image to an internal bu er that is invisible to the user. Why would you want OpenCV to put the frame somewhere you can’t access it?  e answer is that this grabbed frame is unprocessed, and cvGrabFrame() is designed simply to get it onto the computer as quickly as possible. Once you have called cvGrabFrame(), you can then call cvRetrieveFrame().  is func- tion will do any necessary processing on the frame (such as the decompression stage in the codec) and then return an IplImage* pointer that points to another internal bu er (so do not rely on this image, because it will be overwritten the next time you call cvGrabFrame()). If you want to do anything in particular with this image, copy it else- where  rst. Because this pointer points to a structure maintained by OpenCV itself, you are not required to release the image and can expect trouble if you do so. Having said all that, there is a somewhat simpler method called cvQueryFrame().  is is, in e ect, a combination of cvGrabFrame() and cvRetrieveFrame(); it also returns the same IplImage* pointer as cvRetrieveFrame() did. It should be noted that, with a video  le, the frame is automatically advanced when- ever a cvGrabFrame() call is made. Hence a subsequent call will retrieve the next frame automatically. Once you are done with the CvCapture device, you can release it with a call to cvReleaseCapture(). As with most other de-allocators in OpenCV, this routine takes a pointer to the CvCapture* pointer: void cvReleaseCapture( CvCapture** capture );  ere are many other things we can do with the CvCapture structure. In particular, we can check and set various properties of the video source: double cvGetCaptureProperty( CvCapture* capture, int property_id ); int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );  e routine cvGetCaptureProperty() accepts any of the property IDs shown in Table 4-4. Table 4-4. Video capture properties used by cvGetCaptureProperty() and cvSetCaptureProperty() Video capture property Numerical value CV_CAP_PROP_POS_MSEC 0 CV_CAP_PROP_POS_FRAME 1 CV_CAP_PROP_POS_AVI_RATIO 2 CV_CAP_PROP_FRAME_WIDTH 3 CV_CAP_PROP_FRAME_HEIGHT 4 04-R4886-RC1.indd 10404-R4886-RC1.indd 104 9/15/08 4:19:27 PM9/15/08 4:19:27 PM Working with Video | 105 Video capture property Numerical value CV_CAP_PROP_FPS 5 CV_CAP_PROP_FOURCC 6 CV_CAP_PROP_FRAME_COUNT 7 Most of these properties are self explanatory. POS_MSEC is the current position in a video  le, measured in milliseconds. POS_FRAME is the current position in frame number. POS_ AVI_RATIO is the position given as a number between 0 and 1 (this is actually quite use- ful when you want to position a trackbar to allow folks to navigate around your video). FRAME_WIDTH and FRAME_HEIGHT are the dimensions of the individual frames of the video to be read (or to be captured at the camera’s current settings). FPS is speci c to video  les and indicates the number of frames per second at which the video was captured; you will need to know this if you want to play back your video and have it come out at the right speed. FOURCC is the four-character code for the compression codec to be used for the video you are currently reading. FRAME_COUNT should be the total number of frames in the video, but this  gure is not entirely reliable. All of these values are returned as type double, which is perfectly reasonable except for the case of FOURCC (FourCC) [FourCC85]. Here you will have to recast the result in order to interpret it, as described in Example 4-3. Example 4-3. Unpacking a four-character code to identify a video codec double f = cvGetCaptureProperty( capture, CV_CAP_PROP_FOURCC ); char* fourcc = (char*) (&f); For each of these video capture properties, there is a corresponding cvSetCapture Property() function that will attempt to set the property.  ese are not all entirely mean- ingful; for example, you should not be setting the FOURCC of a video you are currently reading. Attempting to move around the video by setting one of the position properties will work, but only for some video codecs (we’ll have more to say about video codecs in the next section). Writing Video  e other thing we might want to do with video is writing it out to disk. OpenCV makes this easy; it is essentially the same as reading video but with a few extra details. First we must create a CvVideoWriter device, which is the video writing analogue of CvCapture.  is device will incorporate the following functions. CvVideoWriter* cvCreateVideoWriter( const char* filename, Table 4-4. Video capture properties used by cvGetCaptureProperty() and cvSetCaptureProperty() (continued) 04-R4886-RC1.indd 10504-R4886-RC1.indd 105 9/15/08 4:19:28 PM9/15/08 4:19:28 PM 106 | Chapter 4: HighGUI int fourcc, double fps, CvSize frame_size, int is_color = 1 ); int cvWriteFrame( CvVideoWriter* writer, const IplImage* image ); void cvReleaseVideoWriter( CvVideoWriter** writer ); You will notice that the video writer requires a few extra arguments. In addition to the  lename, we have to tell the writer what codec to use, what the frame rate is, and how big the frames will be. Optionally we can tell OpenCV if the frames are black and white or color (the default is color). Here, the codec is indicated by its four-character code. (For those of you who are not experts in compression codecs, they all have a unique four-character identi er asso- ciated with them). In this case the int that is named fourcc in the argument list for cvCreate VideoWriter() is actually the four characters of the fourcc packed to- gether. Since this comes up relatively o en, OpenCV provides a convenient macro CV_FOURCC(c0,c1,c2,c3) that will do the bit packing for you. Once you have a video writer, all you have to do is call cvWriteFrame() and pass in the CvVideoWriter* pointer and the IplImage* pointer for the image you want to write out. Once you are  nished, you must call CvReleaseVideoWriter() in order to close the writer and the  le you were writing to. Even if you are normally a bit sloppy about de-allocating things at the end of a program, do not be sloppy about this. Unless you explicitly release the video writer, the video  le to which you are writing may be corrupted. ConvertImage For purely historical reasons, there is one orphan routine in the HighGUI that  ts into none of the categories described above. It is so tremendously useful, however, that you should know about it and what it does.  e function is called cvConvertImage(). void cvConvertImage( const CvArr* src, CvArr* dst, int flags = 0 ); cvConvertImage() is used to perform common conversions between image formats.  e formats are speci ed in the headers of the src and dst images or arrays (the function prototype allows the more general CvArr type that works with IplImage).  e source image may be one, three, or four channels with either 8-bit or  oating-point pixels.  e destination must be 8 bits with one or three channels.  is function can also convert color to grayscale or one-channel grayscale to three-channel grayscale (color). 04-R4886-RC1.indd 10604-R4886-RC1.indd 106 9/15/08 4:19:28 PM9/15/08 4:19:28 PM Exercises | 107 Finally, the flag (if set) will  ip the image vertically.  is is useful because sometimes camera formats and display formats are reversed. Setting this  ag actually  ips the pix- els in memory. Exercises  is chapter completes our introduction to basic I/O programming and data struc-1. tures in OpenCV.  e following exercises build on this knowledge and create useful utilities for later use. Create a program that (1) reads frames from a video, (2) turns the result to gray-a. scale, and (3) performs Canny edge detection on the image. Display all three stages of processing in three di erent windows, with each window appropri- ately named for its function. Display all three stages of processing in one image.b. Hint: Create another image of the same height but three times the width as the video frame. Copy the images into this, either by using pointers or (more cleverly) by creating three new image headers that point to the beginning of and to one-third and two-thirds of the way into the imageData.  en use cvCopy(). Write appropriate text labels describing the processing in each of the three c. slots. Create a program that reads in and displays an image. When the user’s mouse clicks 2. on the image, read in the corresponding pixel (blue, green, red) values and write those values as text to the screen at the mouse location. For the program of exercise 1b, display the mouse coordinates of the individual a. image when clicking anywhere within the three-image display. Create a program that reads in and displays an image.3. Allow the user to select a rectangular region in the image by drawing a rectan-a. gle with the mouse button held down, and highlight the region when the mouse button is released. Be careful to save an image copy in memory so that your drawing into the image does not destroy the original values there.  e next mouse click should start the process all over again from the original image. In a separate window, use the drawing functions to draw a graph in blue, green, b. and red for how many pixels of each value were found in the selected box.  is is the color histogram of that color region.  e x-axis should be eight bins that represent pixel values falling within the ranges 0–31, 32–63, . . ., 223–255.  e y-axis should be counts of the number of pixels that were found in that bin range. Do this for each color channel, BGR. Make an application that reads and displays a video and is controlled by slid-4. ers. One slider will control the position within the video from start to end in 10 04-R4886-RC1.indd 10704-R4886-RC1.indd 107 9/15/08 4:19:28 PM9/15/08 4:19:28 PM 108 | Chapter 4: HighGUI increments; another binary slider should control pause/unpause. Label both sliders appropriately. Create your own simple paint program.5. Write a program that creates an image, sets it to 0, and then displays it. Allow a. the user to draw lines, circles, ellipses, and polygons on the image using the le mouse button. Create an eraser function when the right mouse button is held down. Allow “logical drawing” by allowing the user to set a slider setting to AND, b. OR, and XOR.  at is, if the setting is AND then the drawing will appear only when it crosses pixels greater than 0 (and so on for the other logical functions). Write a program that creates an image, sets it to 0, and then displays it. When the user 6. clicks on a location, he or she can type in a label there. Allow Backspace to edit and provide for an abort key. Hitting Enter should  x the label at the spot it was typed. Perspective transform.7. Write a program that reads in an image and uses the numbers 1–9 on the keypad a. to control a perspective transformation matrix (refer to our discussion of the cvWarpPerspective() in the Dense Perspective Transform section of Chapter 6). Tapping any number should increment the corresponding cell in the perspective transform matrix; tapping with the Shi key depressed should decrement the number associated with that cell (stopping at 0). Each time a number is changed, display the results in two images: the raw image and the transformed image. Add functionality to zoom in or out?b. Add functionality to rotate the image?c. Face fun. Go to the 8. /samples/c/ directory and build the facedetect.c code. Draw a skull image (or  nd one on the Web) and store it to disk. Modify the facedetect pro- gram to load in the image of the skull. When a face rectangle is detected, draw the skull in that rectangle.a. Hint: cvConvertImage() can convert the size of the image, or you could look up the cvResize function. One may then set the ROI to the rectangle and use cvCopy() to copy the properly resized image there. Add a slider with 10 settings corresponding to 0.0 to 1.0. Use this slider to al-b. pha blend the skull over the face rectangle using the cvAddWeighted function. Image stabilization. Go to the 9. /samples/c/ directory and build the lkdemo code (the motion tracking or optical  ow code). Create and display a video image in a much larger window image. Move the camera slightly but use the optical  ow vectors to display the image in the same place within the larger window.  is is a rudimentary image stabilization technique. 04-R4886-RC1.indd 10804-R4886-RC1.indd 108 9/15/08 4:19:28 PM9/15/08 4:19:28 PM 109 CHAPTER 5 Image Processing Overview At this point we have all of the basics at our disposal. We understand the structure of the library as well as the basic data structures it uses to represent images. We under- stand the HighGUI interface and can actually run a program and display our results on the screen. Now that we understand these primitive methods required to manipulate image structures, we are ready to learn some more sophisticated operations. We will now move on to higher-level methods that treat the images as images, and not just as arrays of colored (or grayscale) values. When we say “image processing”, we mean just that: using higher-level operators that are de ned on image structures in order to accom- plish tasks whose meaning is naturally de ned in the context of graphical, visual images. Smoothing Smoothing, also called blurring, is a simple and frequently used image processing opera- tion.  ere are many reasons for smoothing, but it is usually done to reduce noise or camera artifacts. Smoothing is also important when we wish to reduce the resolution of an image in a principled way (we will discuss this in more detail in the “Image Pyra- mids” section of this chapter). OpenCV o ers  ve di erent smoothing operations at this time. All of them are sup- ported through one function, cvSmooth(),* which takes our desired form of smoothing as an argument. void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype = CV_GAUSSIAN, int param1 = 3, * Note that—unlike in, say, Matlab—the  ltering operations in OpenCV (e.g., cvSmooth(), cvErode(), cvDilate()) produce output images of the same size as the input. To achieve that result, OpenCV creates “virtual” pixels outside of the image at the borders. By default, this is done by replication at the border, i.e., input(-dx,y)=input(0,y), input(w+dx,y)=input(w-1,y), and so forth. 05-R4886-AT1.indd 10905-R4886-AT1.indd 109 9/15/08 4:19:56 PM9/15/08 4:19:56 PM [...]... blur Yes 1 ,3 8u, 32 f 8u, 32 f Sum over a param1×param2 neighborhood with subsequent scaling by 1/ (param1×param2) CV_BLUR_NO _SCALE Simple blur with no scaling No 1 8u 16s (for 8u source) or 32 f (for 32 f source) Sum over a param1×param2 neighborhood CV_MEDIAN Median blur No 1 ,3 8u 8u Find median over a Brief description param1×param1 square neighborhood CV_GAUSSIAN Gaussian blur Yes 1 ,3 8u, 32 f 8u (for... sigma The OpenCV implementation of Gaussian smoothing also provides a higher performance optimization for several common kernels 3- by -3, 5-by-5 and 7-by-7 with 112 | Chapter 5: Image Processing Figure 5 -3 Gaussian blur on 1D pixel array the “standard” sigma (i.e., param3 = 0.0) give better performance than other kernels Gaussian blur supports single- or three-channel images in either 8-bit or 32 -bit floatingpoint... 8u 8u Find median over a Brief description param1×param1 square neighborhood CV_GAUSSIAN Gaussian blur Yes 1 ,3 8u, 32 f 8u (for 8u source) or 32 f (for 32 f source) Sum over a param1×param2 neighborhood CV_BILATERAL Bilateral filter No 1 ,3 8u 8u Apply bilateral 3- by -3 filtering with color sigma=param1 and a space sigma=param2 The simple blur operation, as exemplified by CV_BLUR in Figure 5-1, is the simplest... dimensions, the starting images must be divisible by two as many times as there are levels in the Image Pyramids | 133 pyramid For example, for a four-level pyramid, a height or width of 80 (2 × 2 × 2 × 5) would be acceptable, but a value of 90 (2 × 3 × 3 × 5) would not.* The pointer storage is for an OpenCV memory storage area In Chapter 8 we will discuss such areas in more detail, but for now you should know... (CV_16S) or IPL_DEPTH _32 S (CV _32 S) * Here and elsewhere we sometimes use 8u as shorthand for 8-bit unsigned image depth (IPL_DEPTH_8U) See Table 3- 2 for other shorthand notation 110 | Chapter 5: Image Processing Figure 5-1 Image smoothing by block averaging: on the left are the input images; on the right, the output images data types The same operation may also be performed on 32 -bit floating-point... implementation in OpenCV uses Gaussian weighting even though the method is general to many possible weighting functions ‡ Th is effect is particularly pronounced after multiple iterations of bilateral fi ltering 114 | Chapter 5: Image Processing Figure 5-5 Results of bilateral smoothing Image Morphology OpenCV provides a fast, convenient interface for doing morphological transformations [Serra 83] on an image... lter is also normalized to four, rather than to one This is appropriate because the inserted rows have 0s in all of their pixels before the convolution Image Pyramids | 131 of the PyrUp() operator provided by OpenCv Hence, we can use OpenCv to compute the Laplacian operator directly as: Li = Gi − PyrUp(Gi +1 ) The Gaussian and Laplacian pyramids are shown diagrammatically in Figure 5-21, which also shows... differentiated level by level This algorithm (due to B Jaehne [Jaehne95; Antonisse82]) is implemented in OpenCV as cvPyrSegmentation(): void cvPyrSegmentation( IplImage* src, IplImage* dst, 132 | Chapter 5: Image Processing Figure 5-22 Pyramid segmentation with threshold1 set to 150 and threshold2 set to 30 ; the images on the right contain only a subsection of the images on the left because pyramid segmentation... 5 -3) , the first two parameters give the width and height of the filter window; the (optional) third parameter indicates the sigma value (half width at half max) of the Gaussian kernel If the third parameter is not specified, then the Gaussian will be automatically determined from the window size using the following formulae: ⎛n ⎞ σ x = ⎜ x − 1⎟ ⋅0 .30 + 0.80, nx = param1 ⎝2 ⎠ ⎛n ⎞ σ y = ⎜ y − 1⎟ ⋅0 .30 ... operators play a less trivial role Take another look at Figures 5-8 and 5-9, which show the erosion and dilation operators applied to two real images Making Your Own Kernel You are not limited to the simple 3- by -3 square kernel You can make your own custom morphological kernels (our previous “kernel B”) using IplConvKernel Such kernels are allocated using cvCreateStructuringElementEx() and are released using . value CV_CAP_ANY 0 CV_CAP_MIL 100 CV_CAP_VFW 200 CV_CAP_V4L 200 CV_CAP_V4L2 200 CV_CAP_FIREWIRE 30 0 CV_CAP_IEEE 139 4 30 0 CV_CAP_DC 139 4 30 0 CV_CAP_CMU 139 4 30 0 When we call cvCreateCameraCapture(), we pass in an identi er. 8u, 32 f 8u (for 8u source) or 32 f (for 32 f source) Sum over a param1×param2 neighborhood. CV_BILATERAL Bilateral  lter No 1 ,3 8u 8u Apply bilateral 3- by -3  ltering with color sigma=param1. 1 ,3 8u, 32 f 8u, 32 f Sum over a param1×param2 neighborhood with sub- sequent scaling by 1/ (param1×param2). CV_BLUR_NO _SCALE Simple blur with no scaling No 1 8u 16s (for 8u source) or 32 f

Ngày đăng: 12/08/2014, 21:20

TỪ KHÓA LIÊN QUAN

w