Alpha通道?Mat和IplImage访问像素、uchar、Scalar?

最近愚蠢的我碰到的问题:

一、如下面一样写是错的:全输出0 0 0

Mat src = imread(srcfolder);
		Mat bw = imread(donefolder,CV_LOAD_IMAGE_GRAYSCALE);
		int rows = src.rows;
		int cols = src.cols;
		for (int i = 0; i != rows;i++)
		{
			uchar *bwdata = bw.ptr<uchar>(i);
			for (int j = 0; j != cols;j++)
			{
				Scalar bwvalue = bwdata[j];
				if (bwvalue==Scalar(0))
				{
					continue;
				}
				else
				{
					Vec3b values = src.at<uchar>(j, i);
					int blue = values.val[0];
					int green = values.val[1];
					int red = values.val[2];
					cout << red << " " << green << " " << blue << endl;
					//int index = red + green * 256 + blue * 256 * 256;
					//rgbcsv[index] = 255;
					//file << red << "        " << green << "        " << blue<<"\n";
				}
			}
		}
但改成下面就正确了:

IplImage* src = cvLoadImage(srcfolder);
		IplImage* bw = cvLoadImage(donefolder, CV_LOAD_IMAGE_GRAYSCALE);
		int srcstep = src->widthStep / sizeof(uchar);
		uchar *srcdata = (uchar*)src->imageData;
		int bwstep = bw->widthStep / sizeof(uchar);
		uchar *bwdata = (uchar*)bw->imageData;
		for (int i = 0; i != src->height; i++)
		{
			for (int j = 0; j != src->width; j++)
			{
				uchar bwtemp = bwdata[i*bwstep + j + 0];
				if (bwtemp == 0)
				{
					continue;
				}
				else
				{
					int tempb = srcdata[i*srcstep + j*src->nChannels + 0];
					int tempg = srcdata[i*srcstep + j*src->nChannels + 1];
					int tempr = srcdata[i*srcstep + j*src->nChannels + 2];
					cout << tempr << " " << tempg << " " << tempb << endl;
					//file << tempr << "        " << tempg << "        " << tempb << "\n";
				}

			}
		}

同样的问题:下面这样错误:

Vec3b values = srcrect.at<uchar>(j, i);
				int blue = values.val[0];
				int green = values.val[1];
				int red = values.val[2];
				int index = red + green * 256 + blue * 256 * 256;
				int gray = red*0.299 + green*0.587 + blue*0.114;
				if (rgbcsv[index]==255)
				{
					if (gray<17)
					{
						continue;
					}
					else
						dst.at<uchar>(j, i) = 255;
				}
改成下面就正确了:

int dststep = dstimg->widthStep / sizeof(uchar);
	uchar* dstdata = (uchar*)dstimg->imageData;
	int step = testimg->widthStep / sizeof(uchar);
	uchar* data = (uchar*)testimg->imageData;
	uchar tempb, tempg, tempr;
	for (int i = 0; i < testimg->height; i++)
	{
		for (int j = 0; j < testimg->width; j++)
		{
			tempb = data[i*step + j*testimg->nChannels + 0];
			tempg = data[i*step + j*testimg->nChannels + 1];
			tempr = data[i*step + j*testimg->nChannels + 2];
			int rgbpixels = tempr + tempg * 256 + tempb * 256 * 256;
			uchar rgbelement = rgbarray[rgbpixels];
			if (rgbelement == 255){
				uchar gray = tempr*0.299 + tempg*0.587 + tempb*0.114;
				if (gray<17)
				{
					continue;
				}
				dstdata[i*dststep + j*dstimg->nChannels + 0] = 255;
			}
		}
	}
我知道了: Mat时不能用at!要用.ptr<uchar>这样的方式才行!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



二、将图像像素值保存为csv文件时遇到的问题:

1、uchar类型的像素值保存为csv时无法用excel打开,里面是乱码的。所以我将uchar转成了int才行;

2、将int型的r g b通过file保存为csv时 中间不能只用一个空格,否则r g b只占了excel的一个单元格,改成转义字符\t 竟然也不行,所以我改成了8个空格就可以了;这样就可以后续被CvMLData读出来;


三、关于Alpha通道

总所周知,opencv在imread图像时默认是BGR通道,也就是CV_LOAD_IMAGE_COLOR (>0) 那么就是三通道的BGR;如果选择是CV_LOAD_IMAGE_UNCHANGED (<0) 那么就是BGRA ,也就是四通道!!!但我刚在linux下OpenCV3.2运行了下 CV_LOAD_IMAGE_UNCHANGED (<0) 这种情况的,然后立刻输出这个图像的channels是多少,结果发现仍然是3!!!!!!这里与我以前以为的不一样!甚是奇怪????

无奈,我通过:

void createAlphaMat(Mat &mat,Mat primer_src_img)
{
    for (int i = 0; i < mat.rows; ++i) {
        for (int j = 0; j < mat.cols; ++j) {
            Vec4b& bgra = mat.at<Vec4b>(i, j);
            Vec3b bgr=primer_src_img.at<Vec3b>(i,j);
            bgra[0] = bgr[0];
            bgra[1] = bgr[1];
            bgra[2] = bgr[2];
            //bgra[3] = saturate_cast<uchar>(0.5 * (bgra[1] + bgra[2]));
            bgra[3]=0;
        }
    }
}
其中,Mat primer_src_img是CV_LOAD_IMAGE_COLOR (>0) 也就是常用的三通道的BGR;但Mat srcimg(2048,2448,CV_8UC4); 是我规定的4通道的,然后通过
createAlphaMat(srcimg,primer_src_img);
然后紧跟着打印srcimg的channels,结果发现 现在输出是 4!!!!这样才满足我要的4通道的图像?!






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气少女缘结神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值