1、读取并显示图片,namedWindow新建一个显示窗口,imshow输出图片,namedwindow可有可无
Mat image = cv::imread("E:\\其他文档\\图片\\2.jpg", 2);
cv::namedWindow("照片",CV_WINDOW_AUTOSIZE);
cv::imshow("照片", image);//照片窗口中显示图片
2、获取感兴趣区域ROI、TrackBar的添加、AddWeight的使用
imgROI = img1(Range(100, 100 + img2.rows), Range(100, 100 + img2.cols));
//Mat ROI = srcImage1(Rect(200, 200, logo.cols, logo.rows));
addWeighted(imgROI, 0.5, img2, 0.3, 0., imgROI);
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
const int g_nMaxAlphaValue = 100;
int g_nAlphaValueSlider;//滚动条的当前值
double g_dAlphaValue;
double g_dBetaValue;
Mat g_srcImg1;
Mat g_srcImg2;
Mat g_dstImg;
#define WINDOW_NAME "示例"
void onChangeTrackBar(int, void*);
int main()
{
g_srcImg1 = imread("E:\\其他文档\\图片\\4.jpeg");
g_srcImg2 = imread("E:\\其他文档\\图片\\3.jpg");
g_nAlphaValueSlider = 70;
namedWindow(WINDOW_NAME, 1);
string trackBarName = "test";
//trackBarName滚动条的名字,window_name窗口名称,第三个参数是当前值,第四个是最大值,最后一个是回调函数
createTrackbar(trackBarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, onChangeTrackBar);
waitKey(0);
return 0;
}
void onChangeTrackBar(int , void* )
{
g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue;
g_dBetaValue = 1 - g_dAlphaValue;
resize(g_srcImg2, g_srcImg2, Size(g_srcImg1.cols, g_srcImg1.rows));
//权重相加必须是要相同大小的区域,所以上面要resize,其实用感兴趣区域也可以实现该功能
addWeighted(g_srcImg1, g_dAlphaValue, g_srcImg2, g_dBetaValue, 0.0, g_dstImg);
imshow(WINDOW_NAME, g_dstImg);
}
3、鼠标移动过程中记录鼠标的坐标 ,绘制矩形
#define WINDOW_NAME "窗口"
void on_MouseHandle(int, int, int, int, void*);
void DrawRectangle(cv::Mat&, cv::Rect);
Rect g_rectangle;
bool g_bDrawingBox = false;
RNG g_rng(12345);
int main()
{
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)
{
//覆盖tempImage
srcImage.copyTo(tempImage);
//循环绘制
if (g_bDrawingBox)
{
//刷新矩形坐标并且绘制
DrawRectangle(tempImage, g_rectangle);
}
imshow(WINDOW_NAME, tempImage);
if (waitKey(10) == 27)
{
break;
}
}
return 0;
}
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{
Mat& image = *(Mat*)param; //这边(mat*)应该是强转 ,前面的*是解引用
switch (event)
{
//移动过程中,不断改变矩形的长和宽
case EVENT_MOUSEMOVE:
{
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);
}
}
}
void DrawRectangle(cv::Mat& img, cv::Rect box)
{
rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));
}