OpenCV - 基本知识

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)));
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

青山渺渺

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

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

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

打赏作者

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

抵扣说明:

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

余额充值