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