示例一:// 图像像素的算术操作
void CV120201012Dlg::pixelOperator()
{
Mat m1 = imread("E:\\壁纸\\微信图片_20200610160556.jpg");
// 定义变量接收操作之后的图像
Mat img;
img = m1 + Scalar(50,50,50); // - / 都可以, * 需要使用opencv 的 API 函数
/*namedWindow("图像像素算术操作", WINDOW_AUTOSIZE);
imshow("图像像素算术操作",img);*/
// 两幅图像相乘
Mat m2 = Mat::zeros(m1.size(),m1.type());
m2 = Scalar(2,2,2);
// 乘法
multiply(m1,m2,img);
namedWindow("图像像素算术操作 乘法", WINDOW_AUTOSIZE);
imshow("图像像素算术操作 乘法", img);
// 除法
divide(m1, m2, img);
namedWindow("图像像素算术操作 除法", WINDOW_AUTOSIZE);
imshow("图像像素算术操作 除法", img);
m2 = Scalar(59, 50, 52); // 为使得效果更明显 加大数值
// 减法
subtract(m1, m2, img);
namedWindow("图像像素算术操作 减法", WINDOW_AUTOSIZE);
imshow("图像像素算术操作 减法", img);
// 加法
add(m1, m2, img);
namedWindow("图像像素算术操作 加法", WINDOW_AUTOSIZE);
imshow("图像像素算术操作 加法", img);
/*
saturate_cast<uchar>();
可防止 ()中的运算 溢出, <0时 =0 >255时=255
*/
waitKey(0);
}
示例二:滚动条练习 使用滚动条改变图像亮度
static void onTrack(int b,void*)
{
// 对图像进行 算术操作
Mat m1 = imread("E:\\壁纸\\微信图片_20200610160556.jpg");
Mat m2 = Mat::zeros(m1.size(), m1.type());
m2 = Scalar(b, b, b);
// 定义变量接收操作之后的图像
Mat img;
// 加法
add(m1, m2, img);
namedWindow("滚动条", WINDOW_AUTOSIZE);
imshow("滚动条", img);
//waitKey(0); // 不能添加,添加后滚动条的数据显示不会更新
}
void CV120201012Dlg::trackingBar()
{
// 定义一个窗口用来显示图像和滚动条
namedWindow("滚动条", WINDOW_NORMAL);
// 定义一个滚动条
int lightValue = 50;
int maxValue = 100;
createTrackbar("Value", "滚动条", &lightValue,maxValue,onTrack);
onTrack(50,0); // 如果不加这句话,运行后显示的是一幅灰图像,拖动滚动条才显示正常图像
}
示例三: 键盘响应操作
void CV120201012Dlg::keyboardDemo()
{
// 定义一个变量来接收键盘按下的值
Mat m = imread("E:\\壁纸\\微信图片_20200610160556.jpg");
if (m.empty())
{
MessageBox(_T("图像加载失败!"), _T("error"));
return;
}
Mat img = m.clone();
while (1)
{
int key = waitKey(100);
if (key == 27)
{
break;
}
else if (key == 49)
{
cvtColor(m,img,COLOR_BGR2GRAY);
}
else if (key == 50)
{
cvtColor(m, img, COLOR_BGR2HSV);
}
else if (key == 51)
{
m = m + Scalar(50,50,50);
img = m.clone();
}
namedWindow("键盘响应", WINDOW_NORMAL);
imshow("键盘响应", img);
}
}
示例四:颜色图
void CV120201012Dlg::colorMap()
{
// 读取一张图像
Mat m = imread("E:\\壁纸\\微信图片_20200610160556.jpg");
Mat img = Mat::zeros(m.size(),m.type());
// 定义颜色表数组
int m_colorMap[] = {
COLORMAP_AUTUMN , //!< ![autumn](pics/colormaps/colorscale_autumn.jpg)
COLORMAP_BONE , //!< ![bone](pics/colormaps/colorscale_bone.jpg)
COLORMAP_JET , //!< ![jet](pics/colormaps/colorscale_jet.jpg)
COLORMAP_WINTER , //!< ![winter](pics/colormaps/colorscale_winter.jpg)
COLORMAP_RAINBOW, //!< ![rainbow](pics/colormaps/colorscale_rainbow.jpg)
COLORMAP_OCEAN , //!< ![ocean](pics/colormaps/colorscale_ocean.jpg)
COLORMAP_SUMMER , //!< ![summer](pics/colormaps/colorscale_summer.jpg)
COLORMAP_SPRING , //!< ![spring](pics/colormaps/colorscale_spring.jpg)
COLORMAP_COOL , //!< ![cool](pics/colormaps/colorscale_cool.jpg)
COLORMAP_HSV , //!< ![HSV](pics/colormaps/colorscale_hsv.jpg)
COLORMAP_PINK , //!< ![pink](pics/colormaps/colorscale_pink.jpg)
COLORMAP_HOT , //!< ![hot](pics/colormaps/colorscale_hot.jpg)
COLORMAP_PARULA , //!< ![parula](pics/colormaps/colorscale_parula.jpg)
COLORMAP_MAGMA , //!< ![magma](pics/colormaps/colorscale_magma.jpg)
COLORMAP_INFERNO , //!< ![inferno](pics/colormaps/colorscale_inferno.jpg)
COLORMAP_PLASMA , //!< ![plasma](pics/colormaps/colorscale_plasma.jpg)
COLORMAP_VIRIDIS , //!< ![viridis](pics/colormaps/colorscale_viridis.jpg)
COLORMAP_CIVIDIS , //!< ![cividis](pics/colormaps/colorscale_cividis.jpg)
COLORMAP_TWILIGHT , //!< ![twilight](pics/colormaps/colorscale_twilight.jpg)
COLORMAP_TWILIGHT_SHIFTED , //!< ![twilight shifted](pics/colormaps/colorscale_twilight_shifted.jpg)
COLORMAP_TURBO , //!< ![turbo](pics/colormaps/colorscale_turbo.jpg)
COLORMAP_DEEPGREEN //!< ![deepgreen](pics/colormaps/colorscale_deepgreen.jpg)
};
if (m.empty())
{
MessageBox(_T("图像加载失败!"), _T("error"));
return;
}
int index = 0;
while (1) // 循环显示
{
int key = waitKey(1000); // 2 s一刷新
if (key == 27)
{
break;
}
applyColorMap(m,img, m_colorMap[index%21]);
index++;
namedWindow("颜色表", WINDOW_NORMAL);
imshow("颜色表", img);
if (key == 83 || key == 115) // 按下 s 键 保存当前图像
{
std::stringstream filename;
filename << "E:\\壁纸\\colorMap\\" << index <<"--"<< m_colorMap [index%21]<< ".jpg";
imwrite(filename.str(),img);
}
}
}
示例5:图像位操作
void CV120201012Dlg::bitwiseDemo()
{
// 创建俩张图像
Mat m1 = Mat::zeros(Size(255,255),CV_8UC3);
Mat m2 = Mat::zeros(Size(255, 255), CV_8UC3);
// 使用 rectangle 来绘制图像
rectangle(m1,Rect(150,150,80,80),Scalar(255,255,0),-1,LINE_8,0);
rectangle(m2, Rect(200, 200, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0); // -1 填充 >0 绘制(描边)
// 运算
Mat img;
bitwise_and(m1,m2,img);
imshow("与运算", img);
bitwise_or(m1, m2, img);
imshow("或运算", img);
bitwise_xor(m1, m2, img);
imshow("异或运算", img);
bitwise_not(m2, img);
imshow("非运算", img);
}
示例六:通道混合
void CV120201012Dlg::channelDemo()
{
Mat m = imread("E:\\壁纸\\周震南\\微信图片_20200610160556.jpg");
if (m.empty())
{
MessageBox(_T("图像加载失败!"), _T("error"));
return;
}
//分离通道
// 接收分离后通道的数组
std::vector<Mat> chan;
split(m,chan);
imshow("蓝色B", chan[0]);
imshow("绿色G", chan[1]);
imshow("红色R", chan[2]);
// 通道混合
int chanArry[] = {1,2,0,1,2,2};
mixChannels(m,m1, chanArry,3);
imshow("通道混合", m1);
}
涉及到的相关opencv函数,详解请参见https://blog.csdn.net/L946494/article/details/109170017