int main( int argc, char** argv ) {
char* filename = argc == 2 ? argv[1] : (char*)\
if( (image = cvLoadImage( filename, 1)) == 0 ) return -1;
// Create the output image
cedge = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 3);
// 将彩色图像转换为灰度图像
gray = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1);
edge = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1);
cvCvtColor(image, gray, CV_BGR2GRAY); // Create a window
cvNamedWindow(wndname, 1);
// create a toolbar
cvCreateTrackbar(tbarname, wndname, &edge_thresh, 100, on_trackbar);
// Show the image on_trackbar(1);
// Wait for a key stroke; the same function arranges events processing cvWaitKey(0);
cvReleaseImage(&image); cvReleaseImage(&gray); cvReleaseImage(&edge); cvDestroyWindow(wndname); return 0; }
/*******代码中的函数说明 1、cvSmooth,其函数声明为:
cvSmooth( const void* srcarr, void* dstarr, int smoothtype,int param1, int param2, double param3 )
cvSmooth函数的作用是对图象做各种方法的图象平滑。其中,srcarr为输入图象;dstarr为输出图象;
param1为平滑操作的第一个参数;param2为平滑操作的第二个参数(如果param2值为0,则表示它被设为param1); param3是对应高斯参数的标准差。
参数smoothtype是图象平滑的方法选择,主要的平滑方法有以下五种: CV_BLUR_NO_SCALE:简单不带尺度变换的模糊,即对每个象素在 param1×param2领域求和。
CV_BLUR:对每个象素在param1×param2邻域求和并做尺度变换 1/(param1?param2)。
CV_GAUSSIAN:对图像进行核大小为param1×param2的高斯卷积。
CV_MEDIAN:对图像进行核大小为param1×param1 的中值滤波(邻域必须是方的)。
CV_BILATERAL:双向滤波,应用双向 3x3 滤波,彩色设置为param1,空间设置为param2。
2、void cvNot(const CvArr* src,CvArr* dst);
函数cvNot()会将src中的每一个元素的每一位取反,然后把结果赋给dst。 因此,一个值为0x00的8位图像将被映射到0xff,而值为0x83的图像将被映射到0x7c。
3、void cvCanny( const CvArr* image, CvArr* edges, double threshold1,double threshold2, int aperture_size=3 ); 采用 Canny 算法做边缘检测 image 输入图像 edges
输出的边缘图像 threshold1 第一个阈值 threshold2 第二个阈值 aperture_size
Sobel 算子内核大小
4、void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL ); 在使用这个函数之前,你必须用cvCreateImage()一类的函数先开一段内存,然后传递给dst。
cvCopy会把src中的数据复制到dst的内存中。
5、cvCreateTrackbar
创建trackbar并将它添加到指定的窗口。
int cvCreateTrackbar( const char* trackbar_name, const char* window_name, int* value, int count, CvTrackbarCallback on_change ); trackbar_name
被创建的trackbar名字。 window_name
窗口名字,这个窗口将为被创建trackbar的父对象。 value
整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置。 count
滑块位置的最大值。最小值一直是0。 on_change
每次滑块位置被改变的时候,被调用函数的指针。这个函数应该被声明为void Foo(int);
如果没有回调函数,这个值可以设为NULL。
函数cvCreateTrackbar用指定的名字和范围来创建trackbar(滑块或者范围控制),指定与trackbar位置同步的变量,
并且指定当trackbar位置被改变的时候调用的回调函数。被创建的trackbar显示在指定窗口的顶端。 */
角点检测
原始图:
处理后图:
源代码:
#include
#include \#define max_corners 100
int main( int argc, char** argv ) {
int cornerCount=max_corners;
CvPoint2D32f corners[max_corners];
IplImage *srcImage = 0, *grayImage = 0, *corners1 = 0, *corners2 = 0;
int i;
CvScalar color = CV_RGB(255,0,0);
char* filename = argc == 2 ? argv[1] : (char*)\注意相对路径
cvNamedWindow( \1 ); // create HighGUI window with name \
//Load the image to be processed
srcImage = cvLoadImage(filename, 1);
grayImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);
//copy the source image to copy image after converting the format
cvCvtColor(srcImage, grayImage, CV_BGR2GRAY);
//create empty images of same size as the copied images
corners1= cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_32F, 1); corners2= cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F, 1);
cvGoodFeaturesToTrack (grayImage, corners1, corners2, corners, &cornerCount, 0.05, 5, 0,
3, // block size
0, // not use harris 0.4 );
printf(\
// draw circles at each corner location in the gray image and //print out a list the corners if(cornerCount>0) {
for (i=0; i cvCircle(srcImage, cvPoint((int)(corners[i].x), (int)(corners[i].y)), 6, color, 2, CV_AA, 0); } } cvShowImage( \ cvReleaseImage(&srcImage); cvReleaseImage(&grayImage); cvReleaseImage(&corners1); cvReleaseImage(&corners2); cvWaitKey(0); // wait for key. The function has return 0; } 友情链接一下,这是别人写的: http://hi.http://www.wodefanwen.com//xiaoduo170/blog/item/2816460175c8330779ec2c64.html