OpenCV 中cv::Mat 和 IplImage 的转换与应用

在学习opencv图像处理过程中总是遇到数据类型转换的错误提示;因为IplImage是OpenCV中C语言的图像类型;cv::Mat是OpenCV中C++语言的图像类型;所以再利用cv::Mat对图像进行处理的过程中应该注意其图像的数据类型。

1. cv::Mat -> IplImage
cv::Mat matimg = cv::imread ("imagename.jpg");
IplImage* iplimg;
*iplimg = IplImage(matimg);

2. IplImage -> cv::Mat
IplImage* iplimg = cvLoadImage("imagename.jpg");
cv::Mat matimg;
matimg = cv::Mat(iplimg);


为了更好的展示二者的区别,应用的实例如下(提取图像的r,g,b的值)。

#include "cv.h"  
#include "highgui.h"

using namespace cv;
using namespace std;

int main(){
		IplImage* img;
		img = cvLoadImage("D:\\pictures\\lena.jpg");
		IplImage* b_img = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
		IplImage* g_img = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
		IplImage* r_img = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
		int x, y;
		for (y = 0; y < img->height; y++)
		{
			unsigned char* prow = (unsigned char*)(img->imageData + y*img->widthStep);
			unsigned char* brow = (unsigned char*)(b_img->imageData + y*b_img->widthStep);
			unsigned char* grow = (unsigned char*)(g_img->imageData + y*g_img->widthStep);
			unsigned char* rrow = (unsigned char*)(r_img->imageData + y*r_img->widthStep);

			for (x = 0; x < img->width; x++)
			{
				brow[x] = prow[3 * x + 0];
				grow[x] = prow[3 * x + 1];
				rrow[x] = prow[3 * x + 2];
			}
		}

		cvNamedWindow("原图");
		cvShowImage("原图", img);

		cvNamedWindow("b");
		cvShowImage("b", b_img);

		cvNamedWindow("r");
		cvShowImage("r", r_img);

		cvNamedWindow("g");
		cvShowImage("g", g_img);

		cvWaitKey(0);
		return 0;

}


#include<iostream>
#include<opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat orig;
	orig = imread("D:\\pictures\\lena.jpg");
	if (orig.empty())
		cout << "读入失败" << endl;
	imshow("original", orig);
	vector<Mat>m;
	split(orig, m); //提取通道信息,但是当未把其他通道设置为0时显示为灰度图,但各通道信息不同
	vector<Mat>Rchannels, Gchannels, Bchannels;
	//提取通道信息,把orig的通道数据复制到channals
	split(orig, Rchannels);
	split(orig, Gchannels);
	split(orig, Bchannels);
	//将其他通道信息设置为0
	Rchannels[1] = 0;
	Rchannels[2] = 0;
	Gchannels[0] = 0;
	Gchannels[2] = 0;
	Bchannels[0] = 0;
	Bchannels[1] = 0;
	//合并通道信息
	merge(Rchannels, m[0]);
	merge(Gchannels, m[1]);
	merge(Bchannels, m[2]);
	//显示各通道信息
	imshow("B", m[0]);
	imshow("G", m[1]);
	imshow("R", m[2]);
	waitKey(0);
	return 0;
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值