IplImage 与 Mat 转换成uchar

IplImage 与 Mat 转换成uchar

【废话不多说,直接上代码。】

关于IplImage 见:OpenCV 中的IplImage 结构

IplImage 转成 uchar,方法1:

/// <summary>
/// OK
/// </summary>IplImage类型转换成uchar
/// <param name="src"></param>输入:单通道灰度图像指针
/// <param name="dst"></param>输出:单通道灰度图像指针
/// <returns></returns>
int IplImage2Byte(IplImage* src, uchar* dst)
{
	if (NULL == src)
	{
		return -1;
	}

	int i = 0, j = 0;
	int nWidth = src->width;    //图像的宽 像素数.
	int nHeight = src->height;  //图像的高 像素数.
	int nWidthStep = src->widthStep;  //排列的图像行大小,以字节为单位.
	int nbitCount = src->depth;		  //像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, 
									  //  IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F 可支持.
	int nChannel = src->nChannels;    //大多数OPENCV函数支持1,2,3 或 4 个通道.
	char *imgData = src->imageData;   //char *imageData; 指向排列的图像数据.

	uchar* pSrc = NULL;
	uchar* pDst = NULL;


	//FILE *INI,*src_INI;
	//char filename[256], filename2[256];
	//sprintf(filename, "..//输出//pixl_byte.txt");
	//INI = fopen(filename, "a+");

	//sprintf(filename2, "..//输出//pixl_Ipl.txt");
	//src_INI = fopen(filename2, "a+");


	for (i = 0; i < nHeight; i++)
	{
		pSrc = (uchar*)(src->imageData + i * (size_t)nWidthStep);
		pDst = (uchar*)(dst + i * (size_t)nWidth);
		for (j = 0; j < nWidth; j++)
		{
			pDst[j] = pSrc[j];

			//fprintf(src_INI, "%d,   ", pSrc[j]);
			//fprintf(INI, "%d,   ", pDst[j]);
			//if (6==j)
			//{
			//	fprintf(INI, "%d\n", pDst[j]);
			//	fprintf(src_INI, "%d\n", pSrc[j]);
			//}
		}
	}
	//fclose(INI);
	//fclose(src_INI);

	return 1;
}

IplImage 转成 uchar,方法2:

/// <summary>
/// OK
/// IplImage类型转换成uchar
/// </summary>
/// <param name="img"></param>输入:图像指针
/// <param name="dst"></param>输出:图像指针
/// <returns></returns>
int f_IplImage2Byte2(IplImage* img, uchar* dst)
{
	if (img == NULL)
	{
		return -1;
	}

	size_t imgWidth = img->width;
	size_t imgHeight = img->height;

	memcpy(dst, img->imageData, (imgWidth * imgHeight));


	return 1;
}

uchar 转成 IplImage:


//事先需为dst分配空间
IplImage* dst = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 1);

int f_byte2IplImage(int width, int height, uchar* src, IplImage* dst)
{
	for(int y=0; y<height; y++)
	{
		uchar* IPLdata = (uchar*)(dst->imageData + y*dst->widthStep);
		for(int x=0; x<width; x++)
		{
			IPLdata[x] = byteImg[y*width + x];
		}
	}
	
	return 0;
}

关于Mat 见:OpenCV 中的Mat 类

Mat 转成 uchar,方法1:

/// <summary>
/// OK
/// </summary>Mat类型转换成uchar
/// <param name="img"></param>输入:图像指针
/// <param name="dst"></param>输出:图像指针
/// <returns></returns>
int f_Mat2Byte2(cv::Mat* img, uchar* dst)
{
	if (img == NULL)
	{
		return -1;
	}

	size_t imgWidth = img->cols;
	size_t imgHeight = img->rows;

	memcpy(dst, img->data, (imgWidth * imgHeight));


	return 1;
}

【32、不经历风雨,长不成大树,不受百炼,难以成钢。 】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值