opencv常用代码

来源:互联网 发布:淘宝哪家电脑主机好 编辑:程序博客网 时间:2024/05/18 02:02

Mat、IplImage和cvMat的差别和转换
1、图片读取、保存

int main(int argc, char **argv){char*  filepath = "F:\\标志牌测试.jpg";/***用IplImage类型时****/IplImage *m_Source_Pic = cvLoadImage(filepath, 1);//*与m_Source_Pic必须挨在一起,否则报错;flag=-1;默认读取图像的原通道数;flag=0;强制转化读取图像为灰度图;flag=1;读取彩色图cvNamedWindow("example");cvShowImage("原图", m_Source_Pic);/************或者用Mat型读取***********/Mat image = imread(filepath,1);if(!image.data){   AfxMessageBox(_T("图片载入错误!"));   return -1;}/******图像灰度化******/Mat gray_image;cvtColor(image, gray_image, CV_BGR2GRAY);imshow("灰度化图像", gray_image);//保存图片 imwrite("F:\\毕业相关的程序\\交通指示牌的识别\\新建文件夹\\Gray_Image.jpg", gray_image);/******IplImage与Mat转换******/IplImage *m_Source_Pic = &IplImage( Mat Img);WaitKey(0);//cv的延时函数return 0;}

2、通道提取和混合

   vector<Mat> channels;   Mat imageBlueChannel;   Mat imageGreenChannel;   Mat imageRedChannel;   Mat srcImage=imread(filepath,1);   //分离色彩通道   split(srcImage, channels);   imageBlueChannel = channels.at(0);   imageGreenChannel = channels.at(1);   imageRedChannel = channels.at(2);   imshow("蓝色通道", imageBlueChannel);   imshow("绿色通道", imageGreenChannel);   imshow("红色通道", imageRedChannel);   merge(channels, srcImage);   imshow("混合", srcImage);

3、图像滤波
(1)方框滤波

//进行方框滤波操作    Mat out;     boxFilter( image, out, -1,Size(5, 5));

(2)均值滤波

//进行均值滤波操作Mat dstImage; blur( srcImage, dstImage, Size(7, 7)); 

(3)高斯滤波

//进行高斯滤波操作    Mat out;     GaussianBlur( image, out, Size( 5, 5 ), 0, 0 ); 

4、边缘检测
(1)canny算子

Mat dstImage,edge,grayImage;// 【1】创建与src同类型和大小的矩阵(dst)dstImage.create( srcImage1.size(), srcImage1.type() );// 【2】将原图像转换为灰度图像cvtColor( srcImage1, grayImage, COLOR_BGR2GRAY );// 【3】先用使用 3x3内核来降噪blur( grayImage, edge, Size(3,3) );// 【4】运行Canny算子Canny( edge, edge, 3, 9,3 );//【5】将g_dstImage内的所有元素设置为0 dstImage = Scalar::all(0);//【6】使用Canny算子输出的边缘图g_cannyDetectedEdges作为掩码,来将原图g_srcImage拷到目标图g_dstImage中srcImage1.copyTo( dstImage, edge);

(2)sobel算子

Mat grad_x, grad_y;Mat abs_grad_x, abs_grad_y,dst;//【1】载入原始图  Mat src = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图//【2】显示原始图 imshow("【原始图】sobel边缘检测", src); //【3】求 X方向梯度Sobel( src, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT );convertScaleAbs( grad_x, abs_grad_x );imshow("【效果图】 X方向Sobel", abs_grad_x); //【4】求Y方向梯度Sobel( src, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT );convertScaleAbs( grad_y, abs_grad_y );imshow("【效果图】Y方向Sobel", abs_grad_y); //【5】合并梯度(近似)addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst );imshow("【效果图】整体方向Sobel", dst); 

(3)拉普拉斯算子

    Mat src,src_gray,dst, abs_dst;    //【1】载入原始图      src = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图    //【2】显示原始图     imshow("【原始图】图像Laplace变换", src);     //【3】使用高斯滤波消除噪声    GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );    //【4】转换为灰度图    cvtColor( src, src_gray, COLOR_RGB2GRAY );    //【5】使用Laplace函数    Laplacian( src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT );    //【6】计算绝对值,并将结果转换成8位    convertScaleAbs( dst, abs_dst );

4、视频操作
剪切视频

CvCapture* capture = cvCaptureFromAVI("F:\\毕业论文相关\\机场视频\\安检区外北侧.ts");    int i = 0;    IplImage* img = 0;    char image_name[50];    cvNamedWindow("实时视频");    //读取和显示      while (1)    {        img = cvQueryFrame(capture); //获取一帧图片          if (img == NULL)            break;        cvShowImage("实时视频", img); //将其显示          char key = cvWaitKey(20);        sprintf_s(image_name, "%s%d%s","F:\\毕业论文相关\\机场视频\\density_img_", ++i, ".jpg");//保存的图片名          if (i%5==0)        {            cvSaveImage(image_name, img);   //保存一帧图片          }    }    cvReleaseCapture(&capture);    cvDestroyWindow("实时视频");

【部分代码直接粘贴复制于浅墨大神】

0 0