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

C++ 使用opencv从图像创建万花筒效果,c++,opencv,C++,Opencv,我正在尝试使用opencv从图像创建一个万花筒,并试图掌握其中涉及的数学知识。我知道我必须将图像分割成碎片,反射图像并将其旋转60度,从而创建一个由6个三角形组成的多边形。我不理解的是如何分解图像,使用哪些图像片段,丢弃哪些图像片段。如果您有任何想法或链接,我们将不胜感激。数学部分似乎是您作业中的重要部分,因此我将由您决定。但是,如果您将问题向后考虑,可能会稍微容易一些。从万花筒分形图案开始,确定该图案中的每个片段是如何由原始图像创建的 一旦你有了模式,你所要做的就是制作一个映射,将模式中的每个

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

数学部分似乎是您作业中的重要部分,因此我将由您决定。但是,如果您将问题向后考虑,可能会稍微容易一些。从万花筒分形图案开始,确定该图案中的每个片段是如何由原始图像创建的

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

你会发现一个使用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;

}
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
int main()
{
Mat-img,img2,kal1(400400,CV_8UC3,标量(0,0,0));
Mat kal2,添加;
视频捕获上限(0);
int i=0,j=0;
对于(;;)
{
cap>>img;
调整大小(img,img,Size(400400));

对于(i=0;除非您需要极高的分辨率或极高的精度,否则使用OpenGL可能比使用OpenCVI更容易。我同意,但这是一门计算机视觉课程,因此我必须使用opencv。嗯,我对opencv玩得不多,所以我在这方面帮不了什么忙,但在我看来,这是一个不切实际的任务/示例。计算机视觉是一个关于让计算机以某种方式理解物理世界。故意扭曲图像只会使目标更难实现。好吧,我要做的是切割一个等边三角形,然后围绕一个轴点旋转它,创建一个六边形。我可以创建两个循环,一个循环对应我想要的多边形行数,一个循环对应我想要的多边形行数多边形的列数。我想知道的是如何切割这个三角形。我知道我应该创建一个黑色图像并填充三角形所在的像素,但我对如何操作感到困惑。有什么想法吗?