1、首先对于前期配置好的Debug_x64_opencv320.props引入新项目的步骤如下
属性管理器->Debug|x64->添加现有属性表->将原先配置好的Debug_x64_opencv320引入->完成
2、本次共有四个简单的程序
2.1 用imwrite函数将图片保存在工程目录之下
imwrite_Function_Test
2.2 使用addWeighted函数将两个混合显示
mixImgOutput
2.3 使用createTrackbar函数创建Trackbar,并利用其改变两张图片的透明度
createTrackbar_function_test
2.4 使用setMouseCallBack函数读取鼠标操作,画框,保存
setMouseCallBack_function_test
3、下面是程序的源码注释和截图
3.1:imwrite_Function_Test
#include<opencv2/opencv.hpp>
#include<vector>
#include<iostream>
using namespace std;
using namespace cv;
//创建图片
void createAlphaMat(Mat& mat) {
for (int i = 0; i < mat.rows; ++i) {
for (int j = 0; j < mat.cols; ++j) {
Vec4b& rgba = mat.at<Vec4b>(i, j);
rgba[0] = UCHAR_MAX;
rgba[1] = saturate_cast<uchar>(
(float(mat.cols - j)) /
(float(mat.cols)) * UCHAR_MAX);
rgba[2] = saturate_cast<uchar>(
(float(mat.rows - j)) /
(float(mat.rows)) * UCHAR_MAX);
rgba[3] = saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2]));
}
}
}
int main()
{
Mat mat(480,640,CV_8UC4);
createAlphaMat(mat);
vector<int>compression_params;
compression_params.push_back(IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
try {
imwrite("透明Alpha值图.png", mat, compression_params);
imshow("生成的PNG图",mat);
fprintf(stdout,"PNG图片文件的alpha数据保存完毕。\n 可以在工程目录下查看由imwrite函数生成的图片\n");
waitKey(0);
}catch(runtime_error& ex) {
fprintf(stderr,"图像转换成PNG格式发生错误:%s\n",ex.what());
return 1;
}
return 0;
}
生成图片效果图:
工程目录中生成png文件:
3.2 mixImgOutput
#include <iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
Mat img1_SCUlogo = imread("SCULogo.jpg", 1);
Mat img2_mountian= imread("test_img_1920x1080.jpg");
//以下代码分别调用两个窗口显示两个图片
namedWindow("【1】SCUlogo");
imshow("【1】SCUlogo", img1_SCUlogo);
namedWindow("【2】test_img_1920x1080.jpg");
imshow("【2】test_img_1920x1080.jpg",img2_mountian);
//创建Mat对象来进行相关操作
Mat imageROI;
imageROI = img2_mountian(Rect(800,100, img1_SCUlogo.cols, img1_SCUlogo.rows));
/*
如果创建一个Rect对象rect(100, 50, 50, 100),那么rect会有以下几个功能:
rect.area(); //返回rect的面积 5000
rect.size(); //返回rect的尺寸 [50 × 100]
rect.tl(); //返回rect的左上顶点的坐标 [100, 50]
rect.br(); //返回rect的右下顶点的坐标 [150, 150]
rect.width(); //返回rect的宽度 50
rect.height(); //返回rect的高度 100
rect.contains(Point(x, y)); //返回布尔变量,判断rect是否包含Point(x, y)点
*/
addWeighted(imageROI, 0.5, img1_SCUlogo, 0.3, 0., imageROI);
//addWeighted()函数是将两张相同大小,相同类型的图片融合的函数。
/*
void cvAddWeighted(const CvArr * src1, double alpha, const CvArr * src2, double beta, double gamma, CvArr * dst);
参数1:src1,第一个原数组.
参数2:alpha,第一个数组元素权重
参数3:src2第二个原数组
参数4:beta,第二个数组元素权重
参数5:gamma,图1与图2作和后添加的数值。不要太大,不然图片一片白。总和等于255以上就是纯白色了。
参数6:dst,输出图片
*/
namedWindow("【3】融合后的图片");
imshow("【3】融合后的图片", img2_mountian);
imwrite("【3】融合后的图片.jpg", img2_mountian);
waitKey();
return 0;
}
效果图:
3.3createTrackbar_function_test
#include<opencv2/opencv.hpp>
#include"opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
#define WINDOWS_NAME "【滑动条的创建&线性混合示例】"
const int g_nMaxAlphaValue = 100;//alpha值的最大值
int g_nAlphaValueSlider;
double g_dAlphaValue;
double g_dBetaValue;
//下面是声明存储图像的变量
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;
void on_Trackbar(int,void*) {
g_dAlphaValue = (double)g_nAlphaValueSlider/g_nMaxAlphaValue;//求出当前alpha值相对于最大值的比例
g_dBetaValue = (1.0 - g_dAlphaValue);//则beta值为1减去alpha值
//根据alpha值和beta值进行线性混合
addWeighted(
g_srcImage1,g_dAlphaValue,
g_srcImage2,g_dBetaValue,
0.0, g_dstImage);
imshow(WINDOWS_NAME,g_dstImage);
}
int main() {
//加载图像(两个图像的尺寸需要相同)
g_srcImage1 = imread("test2_1920x1080.png");
g_srcImage2 = imread("test1_1920x1080.png");
if (!g_srcImage1.data) {
printf("读取第1张图片错误,请确定目录下是否有imread函数制定图片存在\n"); return -1;
}if (!g_srcImage2.data) {
printf("读取第2张图片错误,请确定目录下是否有imread函数制定图片存在\n"); return -1;
}
//设置滑动条初始值为70
g_nAlphaValueSlider = 70;
//创建窗体
namedWindow(WINDOWS_NAME,1);
//在创建的窗体中创建一个滑动条控件
char TrackbarName[50];
sprintf(TrackbarName,"透明值 %d",g_nMaxAlphaValue);
createTrackbar(TrackbarName,WINDOWS_NAME,
&g_nAlphaValueSlider,g_nMaxAlphaValue,on_Trackbar);
//结果在回调函数中显示
on_Trackbar(g_nAlphaValueSlider,0);
//按任意键退出
waitKey(0);
return 0;
}
效果图:(图片在不同比例下的显示效果)
trackbar效果图-1(100:0):
trackbar效果图-2(40:60):
trackbar效果图-3(0:100):
3.4 setMouseCallBack_function_test
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <iostream>
#define WINDOW_NAME "【程序窗口】"//为窗口定义的宏
using namespace std;
using namespace cv;
//以下是全局函数的声明
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle(cv::Mat& img, cv::Rect box);
//下面是全局变量的声明
Rect g_rectangle;
bool g_bDrawingBox = false;//是否进行绘制
RNG g_rng(12345);
int main() {
//改变console字体颜色
system("color 3F");
//准备参数
g_rectangle = Rect(-1,-1,0,0);
Mat srcImage(600, 800, CV_8UC3), tempImage;
srcImage.copyTo(tempImage);
g_rectangle = Rect(-1, -1, 0, 0);
srcImage = Scalar::all(0);
//设置鼠标操作回弹函数
namedWindow(WINDOW_NAME);
setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&srcImage);
//程序主循环,当进行绘制的标识符为真时,进行绘制
while(1){
srcImage.copyTo(tempImage);
if (g_bDrawingBox)DrawRectangle(tempImage, g_rectangle);//当标识符为真时,进行绘制
imshow(WINDOW_NAME,tempImage);
if (waitKey(10) == 27)break;//按下ESC键,程序退出
}
return 0;
}
void on_MouseHandle(int event, int x, int y, int flags, void* param) {
Mat& image = *(cv::Mat*)param;
switch (event) {
//鼠标移动消息
case EVENT_MOUSEMOVE: {
//如果进行绘制的标识符为真,则记录下长和宽到RECT型变量中
if (g_bDrawingBox) {
g_rectangle.width = x - g_rectangle.x;
g_rectangle.height = y - g_rectangle.y;
}
}break;
case EVENT_LBUTTONDOWN: {
g_bDrawingBox = true;
g_rectangle = Rect(x, y, 0, 0);
}break;
case EVENT_LBUTTONUP: {
g_bDrawingBox = false;
if (g_rectangle.width < 0) {
g_rectangle.x += g_rectangle.width;
g_rectangle.width *= -1;
}
if (g_rectangle.height < 0) {
g_rectangle.y += g_rectangle.height;
g_rectangle.height *= -1;
}
//调用函数进行绘制
DrawRectangle(image, g_rectangle);
break;
}
}
}
//自定义的矩形绘制函数
void DrawRectangle(Mat& img, Rect box) {
rectangle(
img,
box.tl(), box.br(),
Scalar(
g_rng.uniform(0, 255),
g_rng.uniform(0, 255),
g_rng.uniform(0, 255)
)
);
}
绘制多个框图的效果图:






