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("实时视频");
【部分代码直接粘贴复制于浅墨大神】