OpenCv常用函数实例

 
 /** 
* Real Time Eye Tracking and Blink Detection with OpenCV 
* 
* @author Nash <me@nashruddin.com> 
* @license GPL 
* @website http://nashruddin.com 
* 
* See the tutorial at 
* http://nashruddin.com/Real_Time_Eye_Tracking_and_Blink_Detection 
*/ 
#include <stdio.h>   
#include "cv.h"   
#include "highgui.h"   

#pragma comment(lib,"highgui.lib")
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")

void GetColor();

int GetFace();  

void GetCup();
 
int main(int argc, char** argv)   
{   	
	//GetColor(img);
	//GetFace(img);  
	GetCup();
	cvWaitKey(0);
	system("pause");
	return 0;   
}   


void GetCup()
{
	cvNamedWindow("GetCup",CV_WINDOW_AUTOSIZE);
	IplImage *img1=cvLoadImage("img1.jpg");
	IplImage *img2=cvLoadImage("img2.jpg");

	IplImage *diff=cvCreateImage(cvSize(img1->width,img1->height),img1->depth,img1->nChannels);
	cvSub(img1,img2,diff);///背景差
	IplImage *gray=cvCreateImage(cvSize(img1->width,img1->height),8,1);
	cvCvtColor(diff,gray,CV_BGR2GRAY);//转化为8位灰度

	cvThreshold(gray,gray,32,255, CV_THRESH_BINARY);//二值化

	IplConvKernel*    kernel; 
	kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS, NULL);   
	cvMorphologyEx(gray,gray,NULL,kernel,CV_MOP_OPEN,7);///开运算


	/////////////////////////////////////////查找最大面积轮廓
	CvMemStorage*    storage;
	CvSeq* comp=0;
	storage = cvCreateMemStorage(0);
	cvFindContours(gray,storage,&comp,sizeof(CvContour));
	double maxArea=0;
	CvRect maxRect;
	maxRect.x=0;
	maxRect.y=0;
	maxRect.width=0;
	maxRect.height=0;
	for(;comp != 0;)
	{
		double area=fabs(cvContourArea(comp));
		if(area>maxArea)

		{
			CvRect r=cvBoundingRect(comp,1);
			maxRect.x=r.x;
			maxRect.y=r.y;
			maxRect.width=r.width;
			maxRect.height=r.height;			
		}

		comp=comp->h_next;
	}
    ////画矩形
// 	CvPoint a,c;
// 	a.x=maxRect.x;  
// 	a.y=maxRect.y;
// 	c.x=maxRect.x+maxRect.width;
// 	c.y=maxRect.y+maxRect.height;
// 	cvRectangle(img2,a,c,CV_RGB(255,0,0),2,8);
	/////////////////////////////////////////////////面积最大区域 复制
    cvSetImageROI(img2,maxRect);
	IplImage *maxAreaImg;
	maxAreaImg=cvCreateImage(cvSize(maxRect.width,maxRect.height),8,3);
	cvCopy(img2,maxAreaImg);
	cvResetImageROI(img2);
	////////////////////////////////漫水法颜色填充
	CvPoint seedPoint;
	seedPoint.x=0;
	seedPoint.y=0;
	CvScalar newVal;
	newVal.val[0]=0;
	newVal.val[1]=0;
	newVal.val[2]=0;
	CvScalar loDiff = cvScalarAll(2);
	CvScalar upDiff = cvScalarAll(203);  

	cvNamedWindow("GetCup2",CV_WINDOW_AUTOSIZE);
	cvShowImage("GetCup2",img2);

	CvConnectedComp conComp;
	cvFloodFill(img2,seedPoint,newVal,loDiff,upDiff,&conComp);///漫水法填充,并返回区域轮廓

	CvPoint a,b;
	a.x=conComp.rect.x;
	a.y=conComp.rect.y;
	b.x=conComp.rect.x+conComp.rect.width;
	b.y=conComp.rect.y+conComp.rect.height;			
	cvRectangle(img2,a,b,CV_RGB(255,0,0),2,8);
	cvShowImage("GetCup",img2);
	///////////////////////////////////////
	

	
}

int GetFace()   
{  
	IplImage *img=cvLoadImage("face.jpg");

	cvNamedWindow("testF", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("testF2", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("testF3", CV_WINDOW_AUTOSIZE);

	IplImage *img2;
	img2=cvCreateImage(cvSize(img->width,img->height),img->depth,img->nChannels);
	img2=cvCloneImage(img);

	CvSeq* comp=0;
	CvMemStorage*    storage;
	storage = cvCreateMemStorage(0);  

	CvSeq* comp2=0;
	CvMemStorage*    storage2;
	storage2 = cvCreateMemStorage(0);  

	IplConvKernel*    kernel; 
	kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS, NULL);   
	
	if (!storage)   
		printf("cannot allocate memory storage!");   
    IplImage* _diff;   
	IplImage* diff;
	diff=cvCreateImage(cvSize(img->width,img->height),img->depth,1);

	cvCvtColor(img,diff,CV_BGR2GRAY);//灰度图
    
    cvThreshold(diff,diff, 127, 255, CV_THRESH_BINARY);   //二值化
	cvShowImage("testF",diff);
	

	cvMorphologyEx(diff, diff, NULL, kernel, CV_MOP_OPEN, 7);//闭运算
	

	 _diff = cvCloneImage(diff); 
	int nface=cvFindContours(_diff, storage, &comp, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));   //查轮廓
	printf("%d\n",nface);
	for(int i=0;comp != 0;i=i+100)
	{
		CvRect r = cvBoundingRect(comp, 1); 
		double area=fabs(cvContourArea(comp,CV_WHOLE_SEQ));
		printf("%lf\n",area);
		printf("width=%d  height=%d\n",r.width,r.height);
		CvPoint a,c;
		a.x=r.x;  
		a.y=r.y;
		c.x=r.x+r.width;
		c.y=r.y+r.height;
		cvRectangle(img2,a,c,CV_RGB(255,0,0),2,8);

		cvShowImage("testF3",img2);
		//////////////////////////////

		cvSetImageROI(diff,r);
		cvFindContours(diff, storage2, &comp2, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));   //查轮廓

		for(;comp2 != 0;)
		{
			CvRect r2=cvBoundingRect(comp2,1);
			CvPoint a2,c2;
			a2.x=r2.x+r.x;  
			a2.y=r2.y+r.y;
			c2.x=r2.x+r2.width+r.x;
			c2.y=r2.y+r2.height+r.y;

			cvRectangle(img,a2,c2,CV_RGB(255,i,i/6),2,8);
			cvShowImage("testF2",img);
			comp2=comp2->h_next;
		}



		cvWaitKey(100);
		cvResetImageROI(diff);
		comp = comp->h_next; 
	}


	  
    return 0;   
}   



///提取颜色
void GetColor()
{

	IplImage *img=cvLoadImage("face.jpg");

	IplImage*   pImg_test = img;
	int r, g, b;
	
	int intS = 0;

	IplImage* newImg;
	newImg=cvCreateImage(cvSize(img->width,img->height),img->depth,img->nChannels);

	cvNamedWindow("test",CV_WINDOW_AUTOSIZE);
	for(int x = 0; x < pImg_test->width; x++)
	{
		for(int y = 0; y < pImg_test->height; y++) 
		{
			r = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3 + 2);
			g = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3 + 1);
			b = CV_IMAGE_ELEM(pImg_test, uchar, y, x * 3);
			if (r >= 210) 
			{
				CvScalar val;
				val.val[0]=r;
				val.val[1]=g;
				val.val[2]=b;
				cvSet2D(newImg,y,x,val);
				
			}
		}
	}

	
cvShowImage("test",newImg);

printf("ok");

}



 

转载于:https://www.cnblogs.com/zzili/archive/2012/12/06/6663421.html

### C++ OpenCV 常用函数及其示例 #### 图像读取与显示 `cv::imread()` 和 `cv::imshow()` 是两个常用函数,分别用于加载图像和显示图像。 ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { // 使用 imread 函数加载图像 Mat srcImage = imread("image_path.jpg", IMREAD_COLOR); if (srcImage.empty()) { std::cout << "Error loading image!" << std::endl; return -1; } // 使用 imshow 函数显示图像 namedWindow("Original Image", WINDOW_AUTOSIZE); imshow("Original Image", srcImage); waitKey(0); // 等待按键输入 destroyAllWindows(); return 0; } ``` 此代码展示了如何通过 `cv::imread()` 加载一张彩色图片并使用 `cv::imshow()` 进行展示[^1]。 --- #### 直方图均衡化 `cv::equalizeHist()` 可以用来增强图像对比度。它适用于单通道灰度图像。 ```cpp Mat equalizedImage; equalizeHist(srcImage, equalizedImage); // 对灰度图像执行直方图均衡化 imshow("Equalized Image", equalizedImage); ``` 这段代码实现了对灰度图像的直方图均衡化操作,并将其结果显示出来[^1]。 --- #### 图像保存 `cv::imwrite()` 用于将处理过的图像保存到磁盘中。 ```cpp bool success = imwrite("output_image.png", equalizedImage); if (!success) { std::cerr << "Failed to write the image." << std::endl; } ``` 这里演示了如何利用 `cv::imwrite()` 将经过直方图均衡化的图像保存为 PNG 文件[^2]。 --- #### 边缘检测 Sobel 或 Canny 方法可以完成边缘提取任务。 ##### Sobel 检测器 ```cpp Mat sobelX, sobelY, magnitude; Sobel(grayImage, sobelX, CV_8U, 1, 0, 3); // X 方向梯度 Sobel(grayImage, sobelY, CV_8U, 0, 1, 3); // Y 方向梯度 magnitude(sobelX, sobelY, magnitude); // 计算幅值 imshow("Sobel Magnitude", magnitude); ``` ##### Canny 检测器 ```cpp Mat edges; Canny(grayImage, edges, 50, 150); // 参数分别为低阈值和高阈值 imshow("Edges Detected", edges); ``` 这两种方法均能有效识别图像中的边界信息。 --- #### 凸包计算 对于形状分析场景下,可借助 `convexHull` 找出目标物体外部包裹线。 ```cpp std::vector<std::vector<Point>> contours; std::vector<Vec4i> hierarchy; findContours(binaryImage, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 寻找凸包 std::vector<std::vector<Point>> hull(contours.size()); for (size_t i = 0; i < contours.size(); ++i) { convexHull(Mat(contours[i]), hull[i], false); } // 绘制结果 Mat drawing = Mat::zeros(binaryImage.size(), CV_8UC3); for (size_t i = 0; i < contours.size(); ++i) { drawContours(drawing, contours, static_cast<int>(i), Scalar(255, 0, 0), 1, LINE_AA, hierarchy, INT_MAX); drawContours(drawing, hull, static_cast<int>(i), Scalar(0, 0, 255), 1, LINE_AA); } imshow("Convex Hulls", drawing); ``` 上述片段说明了怎样基于二值掩码找到轮廓以及对应的凸壳结构[^3]。 --- #### 物体检测(Haar Cascade) 为了实现特定模式匹配功能,比如人脸或者车牌定位,则需调用预训练好的分类器模型配合 `detectMultiScale` 接口工作。 ```cpp CascadeClassifier cascade; cascade.load("haarcascade_frontalface_default.xml"); std::vector<Rect> objects; cascade.detectMultiScale(imageGray, objects, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); for (const auto& obj : objects) { rectangle(imageColor, obj.tl(), obj.br(), Scalar(255, 0, 0), 2); } imshow("Detected Objects", imageColor); ``` 本部分介绍了 Haar 特征级联分类器的应用实例,可用于快速筛选感兴趣区域[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值