⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opencv_example.cpp

📁 基于OpenCV库函数的几个例子集成
💻 CPP
字号:
// opencv_example.cpp : 定义控制台应用程序的入口点。
//alt + F8自动重排 

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include <cxcore.h>
#include <iostream>
using namespace std;

void fun1()
//读入图像并显示
{
	IplImage * pImage; //声明IplImage指针

	pImage = cvLoadImage("test.jpg",1);//载入图像

	if(!pImage)
		fprintf(stderr,"Can not open image file\n");

	cvNamedWindow("OpenCV win",1);//创建窗口
	cvShowImage("OpenCV win",pImage);//显示图像

	cvWaitKey();//等待按键

	cvDestroyWindow("OpenCV win");//销毁窗口
	cvReleaseImage(&pImage);//释放图像

	return ;
}

void fun2()//载入图像,强制转化为Gray
{
	IplImage *pImage=NULL; //声明IplImage指针

	//载入图像,强制转化为Gray

	pImage = cvLoadImage("Baboon.jpg",0);
	if(!pImage)
		fprintf(stderr,"Can not open image file\n");

	//IplImage *pImage2 =cvCreateImage(cvGetSize(pImage),pImage->depth,pImage->nChannels);

	//cvCopy(pImage,pImage2,NULL);


	//cvSaveImage("BaboonGray.jpg", pImage2);//把图像写入文件

	cvNamedWindow( "cwy Image", 1 );//创建窗口
	cvShowImage( "cwy Image", pImage );//显示图像

	cvWaitKey(0); //等待按键

	cvDestroyWindow( "cwy Image" );//销毁窗口
	cvReleaseImage( &pImage ); //释放图像

	return;
}



void fun3()// * cvCanny:Canny边缘检测
{
	//声明IplImage指针
	IplImage* pImg = NULL; 
	IplImage* pCannyImg = NULL;
	//载入图像,强制转化为Gray
	pImg = cvLoadImage("test.jpg", 0);

	if(!pImg)
		fprintf(stderr,"Can not open image file\n");
	else{
		//为canny边缘图像申请空间
		pCannyImg = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);
		//canny边缘检测
		cvCanny(pImg, pCannyImg, 50, 150, 3);

		//创建窗口
		cvNamedWindow("src", 1);
		cvNamedWindow("canny",1);


		//显示图像
		cvShowImage( "src", pImg );
		cvShowImage( "canny", pCannyImg );

		cvWaitKey(0); //等待按键

		//销毁窗口
		cvDestroyWindow( "src" );
		cvDestroyWindow( "canny" );
		//释放图像
		cvReleaseImage( &pImg ); 
		cvReleaseImage( &pCannyImg ); 
	}
	return;

}

void fun4()//
{
	/**************************************************
	* 轮廓检测
	* 主要函数:
	*      cvFindContours
	*      cvDrawContours
	**************************************************/
	//声明IplImage指针
	IplImage* pImg = NULL; 
	IplImage* pContourImg = NULL;
	CvMemStorage * storage = cvCreateMemStorage(0);
	CvSeq * contour = 0;
	int mode = CV_RETR_EXTERNAL;

	mode = CV_RETR_CCOMP; //内外轮廓都检测


	//创建窗口
	cvNamedWindow("src", 1);
	cvNamedWindow("contour",1);

	//载入图像,强制转化为Gray
	pImg = cvLoadImage("Fruits.jpg",0);
	if(!pImg)
	{	fprintf(stderr,"Can not open image file\n");
	//销毁窗口
	cvDestroyWindow( "src" );
	cvDestroyWindow( "contour" );
	cvReleaseMemStorage(&storage);
	return;
	}else{
		cvShowImage( "src", pImg );
		//为轮廓显示图像申请空间
		//3通道图像,以便用彩色显示
		pContourImg = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);
		//copy source image and convert it to BGR image cvCvtColor(pImg, pContourImg, CV_GRAY2BGR);
		//查找contour
		cvFindContours( pImg, storage, &contour, sizeof(CvContour),mode, CV_CHAIN_APPROX_SIMPLE);
	}   



	//将轮廓画出    
	cvDrawContours(pContourImg, contour,CV_RGB(0,0,255), CV_RGB(255, 0, 0),2, 2, 8);
	//显示图像
	cvShowImage("contour", pContourImg );
	cvWaitKey(0);

	//销毁窗口
	cvDestroyWindow( "src" );
	cvDestroyWindow( "contour" );
	//释放图像
	cvReleaseImage( &pImg ); 
	cvReleaseImage( &pContourImg ); 
	cvReleaseMemStorage(&storage);

	return ;
}
void fun5()//
{
	/**************************************************
	* 背景建模,运动物体检测
	*      
	**************************************************/
	//声明IplImage指针
	IplImage* pFrame = NULL; 
	IplImage* pFrImg = NULL;
	IplImage* pBkImg = NULL;

	 CvMat* pFrameMat = NULL; //二维矩阵数据结构
	CvMat* pFrMat = NULL;
	CvMat* pBkMat = NULL;  

	CvCapture* pCapture = NULL;  //视频获取结构 

	int nFrmNum = 0;

	//创建窗口
	cvNamedWindow("video", 1);
	cvNamedWindow("background",1);
	cvNamedWindow("foreground",1);
	//使窗口有序排列
	cvMoveWindow("video", 30, 0);
	cvMoveWindow("background", 360, 0);
	cvMoveWindow("foreground", 690, 0);

	//打开视频文件
	if( !(pCapture = cvCaptureFromFile("a.avi")))
	{
		fprintf(stderr, "Can not open video file %s\n", "a.avi");
		//销毁窗口
		cvDestroyWindow("video");
		cvDestroyWindow("background");
		cvDestroyWindow("foreground");
		return;
	}

	//逐帧读取视频
	while(pFrame = cvQueryFrame( pCapture ))
	{
		nFrmNum++;

		//如果是第一帧,需要申请内存,并初始化
		if(nFrmNum == 1)
		{
			pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);
			pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);

			pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
			pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
			pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);

			//转化成单通道图像再处理
			cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
			cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);

			cvConvert(pFrImg, pFrameMat);
			cvConvert(pFrImg, pFrMat);
			cvConvert(pFrImg, pBkMat);
		}
		else
		{
			cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
			cvConvert(pFrImg, pFrameMat);
			//高斯滤波先,以平滑图像
			//cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0);

			//当前帧跟背景图相减
			cvAbsDiff(pFrameMat, pBkMat, pFrMat);

			//二值化前景图
			cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);

			//进行形态学滤波,去掉噪音  
			//cvErode(pFrImg, pFrImg, 0, 1);
			//cvDilate(pFrImg, pFrImg, 0, 1);

			//更新背景
			cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);
			//将背景转化为图像格式,用以显示
			cvConvert(pBkMat, pBkImg);

			//显示图像
			cvShowImage("video", pFrame);
			cvShowImage("background", pBkImg);
			cvShowImage("foreground", pFrImg);

			//如果有按键事件,则跳出循环
			//此等待也为cvShowImage函数提供时间完成显示
			//等待时间可以根据CPU速度调整
			if( cvWaitKey(2000) >= 0 )
				break;
		}

	}

 // cvWaitKey(2000);
  //销毁窗口
  cvDestroyWindow("video");
  cvDestroyWindow("background");
  cvDestroyWindow("foreground");

  //释放图像和矩阵
 cvReleaseImage(&pFrImg);
 cvReleaseImage(&pBkImg);

  cvReleaseMat(&pFrameMat);
  cvReleaseMat(&pFrMat);
  cvReleaseMat(&pBkMat);

  return ;


}
int _tmain(int argc, _TCHAR* argv[])
{
	int choose=-1;
	while(choose)
	{
		cout<<"请选择要进行的图像操作:\n";
		cout<<"1 读入图像并显示  2.载入图像,强制转化为Gray 3.Canny边缘检测   4轮廓检测  5运动物体检测  6.退出\n";
		cin>>choose;
		switch(choose)
		{
		case 1:fun1();break;
		case 2:fun2();break;
		case 3:fun3();break;
		case 4:fun4();break;
		case 5:fun5();break;
		case 6:choose=0;break;
		default: break;
		}
	}
	getchar();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -