为什么突然想到要用VS2017与OpenCV对图像进行操作呢,我的毕设课题是:Leap Motion与三维图像交互,那么,第一步当然是学会与二维图像交互了,这之中的第一步又是使用OpenCV对二维图像平移和缩放等操作。
我想出了一种很简单但是很实用的方法:在自定义大小的一张画布上边显示图片并可以进行平移和缩放,代码很简单相信大家一看就懂,可以在此基础上二次开发。
**本次实验代码的核心思想是:通过对任意一张图片进行颜色扩充,使我们看起来感觉画布不变而是图片在自由移动和缩放。**代码如下:
#include <iostream>
#include <cstring>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
class show_picture //定义一个新的用来与图像交互的类
{
public :
Mat image, image_size_change, image_for_display;//image是原始图片,永远不做更改。image_size_change相当于每一次更改后的图片。image_for_display是用来显示的,相当于包含了image_size_change的画布。
float mul=1.0;
void imshow_FullScreen(Mat img);//在画布上显示图片
void Translation(int dx, int dy);//图片平移
void Change_Size(float div);//图片放大缩小
show_picture(int width, int length, int x, int y)
{
Screen_Width = width;
Screen_Length = length;
point_O.x = x;
point_O.y = y;
}
show_picture()//定义新成员后默认为1080*1920大小的画布
{
Screen_Width = 1080;
Screen_Length = 1920;
point_O.x = 0;
point_O.y = 0;
}
private:
Point point_O;//图片的左上方原点(用来定位图片)
int Screen_Width, Screen_Length;//画布的长和宽
};
/****************带有平移操作的图片显示函数,自定义画布*****************/
void show_picture::Translation(int dx, int dy)
{
point_O.x += dx;
point_O.y += dy;
imshow_FullScreen(image_size_change);
}
/****************显示带有画布的图片*****************/
void show_picture::imshow_FullScreen(Mat img)
{
copyMakeBorder(img, image_for_display, point_O.y, Screen_Width-point_O.y-img.rows, point_O.x, Screen_Length-point_O.x-img.cols, BORDER_CONSTANT, Scalar(190, 190, 190));//OpenCV自带的扩充图片的函数
namedWindow("Canvases", WINDOW_AUTOSIZE);
circle(image_for_display, point_O, 5, Scalar(0, 0, 255));//标注原点位置方便调试
imshow("Canvases", image_for_display);//最终显示的是扩充后的图片
}
/****************带有缩放操作的图片显示函数,自定义画布*****************/
void show_picture::Change_Size(float div)
{
point_O.x += (image_size_change.cols - image_size_change.cols*div)/ 2;//计算缩放后的新的坐标
point_O.y += (image_size_change.rows - image_size_change.rows*div) / 2;
mul *= div;//采用对每一次的缩放因子累计相乘的方式来消除因为缩放引起的模糊问题
resize(image, image_size_change, Size(), mul, mul);//这里使用的是image原始图片,因此不会越来越模糊
imshow_FullScreen(image_size_change);
}
int main()
{
show_picture picture(1000,1000,10,10);//定义一个1000*1000大小的画布,初始原点在(10,10)的位置
picture.image = imread("C:\\Users\\MacheNike\\Desktop\\lena.bmp");//读入原始图片
resize(picture.image, picture.image_size_change, Size(), 1, 1);//开始先让缓存图片与原始图片一致
picture.Translation(200, 200);//平移量为:dx=200,dy=200;
waitKey(2000);
picture.Change_Size(0.5);//等比例缩小为上一次的0.5倍
waitKey(2000);
picture.Translation(-200, -200);//平移量为:dx=-200,dy=-200;
waitKey(2000);
picture.Change_Size(2.0);//等比例放大为上一次的2倍
waitKey(2000);
}
在此次代码的基础上便可以使用Leap Motion的相关接口函数进行固定画布上的二维图像的交互了。