使用opencv从图像创建万花筒效果

时间:2013-11-20 04:51:45

标签: c++ opencv

我正在尝试使用opencv从图像创建万花筒,并试图掌握所涉及的数学。我知道我必须将图像分割成碎片,反射它并将其旋转60度,创建一个由6个三角形组成的多边形。我不理解的是如何打破图像以及使用哪些图像以及丢弃哪些图像。任何想法或链接将不胜感激。

2 个答案:

答案 0 :(得分:0)

数学部分似乎是你作业的重要部分,所以我会把它留给你。但是,如果您认为问题倒退,可能会稍微容易一些。从万花筒分形图案开始,确定原始图像如何创建该图案中的每个片段。

一旦你有了模式,你所要做的就是制作一个地图,将模式中的每个像素映射到图像中的一个像素,并使用OpenCV函数(如remap)来进行实际的映射。 / p>

答案 1 :(得分:0)

here您将找到使用OpenCV的示例实现

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
    Mat img,img2,kal1(400,400,CV_8UC3,Scalar(0,0,0));
    Mat kal2,add;
    VideoCapture cap(0);
    int i=0,j=0;
    for(;;)
    {
        cap>>img;
        resize(img,img,Size(400,400));
        for(i=0;i<600;i++)
        {
            for(j=0;j<i/3;j++)
            {
                    kal1.at<uchar>(Point(i,j))=img.at<uchar>(Point(i,j));//gives 1/8 of img

                if(j>i)
                {
                    continue;
                }
            }

        }
        flip(kal1,kal2,0);
        addWeighted(kal1,1,kal2,1,0,add);
        flip(kal2,kal2,1);
        addWeighted(add,1,kal2,1,0,add);
        flip(kal2,kal2,0);
        addWeighted(add,1,kal2,1,0,add);
        transpose(kal2,kal2);
        addWeighted(add,1,kal2,1,0,add);
        flip(kal2,kal2,0);
        addWeighted(add,1,kal2,1,0,add);
        flip(kal2,kal2,1);
        addWeighted(add,1,kal2,1,0,add);
        flip(kal2,kal2,0);
        addWeighted(add,1,kal2,1,0,add);
        line(img,Point(200,0),Point(200,200),Scalar(0,255,255),1);
        line(img,Point(0,0),Point(200,200),Scalar(0,255,255),1);
        moveWindow("img",30,30);
        moveWindow("Kaleidoscope",500,30);
        imshow("img",img);
        imshow("Kaleidoscope",add);
        waitKey(10);
    }

    return 1;

}