最近一直在学习opencv和图像处理,自己作个总结吧
int Corner(int i) { int totalnum; cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,i); IplImage* imageB = cvQueryFrame(capture); cvSetImageROI(imageB, cvRect(Size,Size, imageB->width-Size, imageB->height-Size)); //提取帧中的(size,size)为点,高为imageB->height-Size //宽为imageB->width-Size IplImage *img2 = cvCreateImage(cvGetSize(imageB), imageB->depth, imageB->nChannels); cvCopy(imageB, img2, NULL); cvResetImageROI(imageB); totalnum = compute_corner(img2); cvReleaseImage(&img2); totalnum = compute_corner(imageB); return totalnum; } int compute_corner(IplImage* image) { int block_size=3; int aperture_size=7; double k=0.04; int totalCornerNum=0; IplImage* im1 = cvCreateImage(cvGetSize(image), IPL_DEPTH_32F, 1); IplImage* tempImage = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1); IplImage* im2 = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3); cvCvtColor(image, tempImage, CV_BGR2GRAY); //颜色转化 作为参数CV_BGR2GRAY把rgb转化为灰度级的 cvCornerHarris(tempImage, im1, block_size, aperture_size, k);//哈里斯角点检测,im1存储存储哈里斯(Harris)检测responces的图像。与输入图像等大。 int Thresh=0; double scale=1,shift=0; //该函数首先对输入数组的元素进行比例缩放,然后将shift加到比例缩放后得到的各元素上,即: dst(I)=src(I)*scale + (shift,shift,...),最后可选的类型转换将结果拷贝到输出数组。 cvConvertScale( im1, tempImage, scale,shift); cvThreshold( tempImage, tempImage ,Thresh, 255, CV_THRESH_OTSU ); //取阀值为OTSU把图像转为二值图像 for(int i=0; i<tempImage->height; i++) for(int imdata=0,j=0; j<tempImage->width; j++) { imdata=*(tempImage->imageData + tempImage->widthStep*i+j); if(imdata != 0) totalCornerNum++; } cvReleaseImage(&im1); cvReleaseImage(&tempImage); cvReleaseImage(&im2); return totalCornerNum; }