为三通道图像添加alpha透明通道
int main()
{
//@ 读取图像
string image_path = "**Desktop\\image\\person\\girl101.jpeg";
Mat src = imread(image_path, IMREAD_COLOR);
//@ 分离通道,有两种方式
// (1)分离到向量
vector rgb3Channels;
split(src, rgb3Channels);
// (2)分离到数组
//Mat aChannels[3];
//split(src, aChannels);
//@ 创建一个alpha通道,全0。然后选定一个矩形区域,将其赋值为255
Mat zero_mat = Mat::zeros(Size(src.cols, src.rows), CV_8UC1);
Mat roi(zero_mat, Rect(0, 0, src.cols/2, src.rows/2)); // 证明alpha赋值为0的做法是正确有效的。
roi = Scalar(255);//单通道情况时,Scalar中一个参数
namedWindow("zero_mat", CV_WINDOW_NORMAL);
imshow("zero_mat", zero_mat);
//@ 合并通道,同样有两种方式,这里不写了,一种数组,一种vector
vector channels_4;
channels_4.push_back(rgb3Channels[0]); //b
channels_4.push_back(rgb3Channels[1]); //g
channels_4.push_back(rgb3Channels[2]); //r
channels_4.push_back(zero_mat); //alpha=0
Mat img_alpha_0;
merge(channels_4, img_alpha_0);
imwrite("img_alpha_01.png", img_alpha_0);
namedWindow("img_alpha_0", CV_WINDOW_NORMAL);
//@ 实际上已经添加了透明通道了,可以从保存的图像文件查看
//@ 但是这里假如直接imshow的话,不会显示透明通道
imshow("img_alpha_0", img_alpha_0);
waitKey(0);
return 0;
}
这里imshow img_alpha_0的时候,没有显示alpha通道,但是查看一下保存的图像可以看到alpha
opencv还有一种分离通道的方法,摘自:
OpenCV学习笔记(二十一)---三通道和四通道之间的区别 - JavaShuo
int main()
{
Mat rgba(4, 4, CV_8UC4, Scalar(1, 2, 3, 4));
cout << "rgba =" << endl << rgba << endl;
cout << "rgba.rows=" << rgba.rows << ",rgba.cols=" << rgba.cols << endl;
Mat bgr(rgba.rows, rgba.cols, CV_8UC3);
Mat alpha(rgba.rows, rgba.cols, CV_8UC1);
// forming an array of matrices is a quite efficient operation,
// because the matrix data is not copied, only the headers
Mat out[] = { bgr, alpha }; //注意out[]的含义,分裂到一个Mat数组中
// rgba[0] -> bgr[2], rgba[1] -> bgr[1],
// rgba[2] -> bgr[0], rgba[3] -> alpha[0]
int from_to[] = { 0,2, 1,1, 2,0, 3,3 }; //指定分裂规则
mixChannels(&rgba, 1, out, 2, from_to, 4);
cout << "bgr =" << endl << bgr << endl;
cout << "alpha =" << endl << alpha << endl;
system("pause");
waitKey(0);
return 0;
}
对图像
#include
#include
using namespace std;
using namespace cv;
string imgName = "lena256.tif";
int main(int argc, char* argv[])
{
Mat src = imread(imgName);
Mat img;
resize(src, img, Size(src.cols*0.5, src.rows * 0.5)); // 缩小操作
Mat channel[3];
split(img, channel);
imshow("original", img);
imshow("B", channel[0]);
imshow("G", channel[1]);
imshow("R", channel[2]);
//set blue channel to 0
channel[0] = Mat::zeros(img.rows, img.cols, CV_8UC1);
//merge red and green channels
merge(channel, 3, img);
imshow("R_G_merge", img);
waitKey(0);
return 1;
}
对摄像头视频流
#include
#include
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
VideoCapture cap;
cap.open(0);
if (!cap.isOpened())
{
exit(0);
}
cap.set(CV_CAP_PROP_FRAME_WIDTH, 250);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 250);
cout << "Frame Width: " << cap.get(CV_CAP_PROP_FRAME_WIDTH) << endl;
cout << "Frame Height: " << cap.get(CV_CAP_PROP_FRAME_HEIGHT) << endl;
Mat frame;
vector rgb;
cap >> frame;
namedWindow("original", 1);
namedWindow("red", 1);
namedWindow("green", 1);
namedWindow("blue", 1);
for (;;)
{
cap >> frame;
imshow("original", frame);
split(frame, rgb);
imshow("red", rgb.at(2));
imshow("green", rgb.at(1));
imshow("blue", rgb.at(0));
if (waitKey(30) >= 0)
break;
}
waitKey(0);
return 1;
}