OpenCV实现拼图板小游戏

 更新时间:2020年4月25日 17:25  点击:1801

80后可能还对儿时玩过的一种经典木质的拼图板游戏记忆犹新,一般是一种4*4或5*5规格的手持活动板,通过挪动每个小板子的位置,拼出来板子上完整的图像,那时候还没有网吧,手机也还是大哥大的天下,所以这也可以算得上是最早的“手游”了吧。

今天我们用OpenCV来复现一下儿时的经典!

代码:

#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include <time.h>
 
using namespace cv;
 
Mat Sourceimage, Spilteimage, Rebuildimage, Dstimage;
int rows, cols;
int Roirows, Roicols;
vector<Mat>arraryimage;
void Randarrary(vector<Mat> &vectorMat); //随机排列子图像序列函数
static int vectornumber = 0;
void OnMouseAction(int event, int x, int y, int flags, void *ustc); //鼠标回调事件函数
 
int mainFun()
{
 Sourceimage = imread("D:\\test\\lena.jpg");
 imshow("Source image", Sourceimage);
 rows = 6; //将图像分割成rows行
 cols = 4; //将图像分割成cols列
 Roirows = Sourceimage.rows / rows;
 Roicols = Sourceimage.cols / cols;
 Spilteimage = Mat::zeros(Sourceimage.rows, Sourceimage.cols, Sourceimage.type());
 Dstimage = Mat::zeros(Sourceimage.rows, Sourceimage.cols, Sourceimage.type());
 for (int i = 0; i<rows; i++)
 {
 for (int j = 0; j<cols; j++)
 {
 Mat SourceRoi = Sourceimage(Rect(j*Roicols, i*Roirows, Roicols - 1, Roirows - 1));
 arraryimage.push_back(SourceRoi);
 }
 }
 // 随机函数
 Randarrary(arraryimage);
 
 for (int i = 0; i<rows; i++)
 {
 for (int j = 0; j<cols; j++)
 {
 Mat SpilterRoi = Spilteimage(Rect(j*Roicols, i*Roirows, Roicols - 1, Roirows - 1));
 addWeighted(SpilterRoi, 0, arraryimage[vectornumber], 1, 0, SpilterRoi);
 vectornumber++;
 imshow("Splite image", Spilteimage);
 waitKey(150);
 }
 }
 setMouseCallback("Splite image", OnMouseAction);
 waitKey();
 
 return 0;
 
}
 
//*******************************************************************//
//随机调换所有的子图像序列的位置,用于在 Splite image中显示
//*******************************************************************//
void Randarrary(vector<Mat>& vectorMat)
{
 for (int i = 0; i<vectorMat.size(); i++)
 {
 srand(int(time(0)));
 int a = rand() % (vectorMat.size() - i) + i;
 swap(vectorMat[i], vectorMat[a]);
 }
 
}
 
//*******************************************************************//
//鼠标回调函数,用于获取需要查找的子图像在原图像中的位置,并在叠加显示在目标图像中
//*******************************************************************//
void OnMouseAction(int event, int x, int y, int flags, void *ustc)
{
 if (event == CV_EVENT_LBUTTONDOWN)
 {
 Mat RoiSpilte, RoiSource;
 int rows = (y / Roirows)*Roirows;
 int clos = (x / Roicols)*Roicols;
 
 RoiSpilte = Spilteimage(Rect(clos, rows, Roicols, Roirows));
 imshow("Slice", RoiSpilte);
 
 Mat image = Mat::zeros(Sourceimage.rows - Roirows, Sourceimage.cols - Roicols, CV_32FC1);
 matchTemplate(Sourceimage, RoiSpilte, image, 1);
 normalize(image, image, 0, 1, NORM_MINMAX);
 
 double minV = 0;
 double maxV = 0;
 Point minP, maxP;
 
 minMaxLoc(image, &minV, &maxV, &minP, &maxP);
 
 Mat ROIDst = Dstimage(Rect(minP.x, minP.y, Roicols, Roirows));
 addWeighted(ROIDst, 0, RoiSpilte, 1, 0, ROIDst, -1);
 imshow("Jigsaw image", Dstimage);
 }
}
 
 
//-----开始------
void COpenCVLearningDlg::OnBnClickedStartButton()
{
 mainFun();
}

效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • python opencv 画外接矩形框的完整代码

    这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
  • python opencv通过4坐标剪裁图片

    图片剪裁是常用的方法,那么如何通过4坐标剪裁图片,本文就详细的来介绍一下,感兴趣的小伙伴们可以参考一下...2021-06-04
  • OpenCV如何去除图片中的阴影的实现

    这篇文章主要介绍了OpenCV如何去除图片中的阴影的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-29
  • 解决使用OpenCV中的imread()内存报错问题

    这篇文章主要介绍了解决使用OpenCV中的imread()内存报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • python OpenCV学习笔记

    这篇文章主要介绍了python OpenCV的相关资料,帮助大家更好的理解和学习使用python的opencv,感兴趣的朋友可以了解下...2021-03-31
  • 使用OpenCV去除面积较小的连通域

    这篇文章主要介绍了使用OpenCV去除面积较小的连通域,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-05
  • JavaScript 实现生命游戏

    这篇文章主要介绍了JavaScript 实现生命游戏的示例步骤,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下...2021-04-24
  • 关于python pygame游戏进行声音添加的技巧

    这篇文章主要给大家分享的是pygame游戏进行声音添加的方法,这文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!...2021-10-23
  • 详解pycharm的python包opencv(cv2)无代码提示问题的解决

    这篇文章主要介绍了详解pycharm的python包opencv(cv2)无代码提示问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-29
  • 在C#中使用OpenCV(使用OpenCVSharp)的实现

    这篇文章主要介绍了在C#中使用OpenCV(使用OpenCVSharp)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-15
  • 用js实现拼图小游戏

    这篇文章主要为大家详细介绍了用js实现拼图小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
  • C#拼图游戏编写代码

    这篇文章主要为大家详细介绍了C#拼图游戏的编写代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • 13个有趣又好玩的Python游戏代码分享

    今天小编跟大家分享13个有趣又好玩的Python小游戏示例代码,教你如何通过边打游戏边学编程!感兴趣的小伙伴快跟随小编一起学习起来...2022-02-23
  • 基于Python-Pycharm实现的猴子摘桃小游戏(源代码)

    这篇文章主要介绍了基于Python-Pycharm实现的猴子摘桃小游戏,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-20
  • python基于tkinter制作图形界面的2048游戏

    这篇文章主要介绍了python基于tkinter制作图形界面的2048游戏的方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-04-06
  • C++ opencv实现车道线识别

    这篇文章主要为大家详细介绍了C++ opencv实现车道线识别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-20
  • 详解opencv中画圆circle函数和椭圆ellipse函数

    这篇文章主要介绍了opencv中画圆circle函数和椭圆ellipse函数,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-09
  • python中的opencv和PIL(pillow)转化操作

    这篇文章主要介绍了python中的opencv和PIL(pillow)转化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • OpenCV-Python实现凸包的获取

    凸包是一个计算几何中的概念,在图像处理过程中,我们常常需要寻找图像中包围某个物体的凸包,本文就使用OpenCV实现,感兴趣的可以了解一下...2021-06-08
  • Opencv LBPH人脸识别算法详解

    这篇文章主要为大家详细介绍了Opencv LBPH人脸识别算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25