opencv常用代码

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("实时视频");

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值