ばらばら殺ぺんぎん事件(OpenCVでStitchingしてみるか)
はい、物騒なタイトルついてますが、stitchingになります。
ソースは下記のペンギンさんの画像の赤枠部分(256×256が20枚)です。
画像縮小しちゃったけど、こんな感じの20枚
結果は、こちら
ふむ、とてもよい感じ…パフォーマンスを除けば。
…と思ったら、あれ?右下とか復元できてないような?
ソースはこの下。
#include <opencv/cv.hpp>
#include <opencv2/stitching.hpp>
int main(){
cv::Mat result;
std::vector< cv::Mat > imageList;
for(int i=0;i<20;i++){
char fname[255] ;
sprintf(fname,"A%05d.jpg", i);
imageList.push_back( cv::imread(fname) );
}
cv::Stitcher stitcher = cv::Stitcher::createDefault();
stitcher.stitch(imageList, result);
cv::imwrite("stitched.jpg", result);
cv::namedWindow("SRC");
cv::imshow("SRC", result);
cv::waitKey(-1);
return 0;
}
ついでにサンプルデータの作ったのはこれ。
#include <opencv/cv.hpp>
int main(){
cv::Mat source = cv::imread("Penguins.jpg");
cv::Mat result;
source.copyTo(result);
cv::cvtColor(result, result, CV_BGR2GRAY);
cv::cvtColor(result, result, CV_GRAY2BGR);
cv::RNG rng;
for(int i=0;i<20;i++){
char fname[255] ;
retry:
int x1 = rng.uniform( (double)0, (double)source.cols);
int y1 = rng.uniform( (double)0, (double)source.rows);
int left = x1;
int top = y1;
int width = 256;
int height = 256;
int x2 = x1 + width;
int y2 = y1 + height;
if(x2 >= source.cols){ goto retry;}
if(y2 >= source.rows){ goto retry;}
cv::line(result, cv::Point(x1,y1), cv::Point(x1,y2), cv::Scalar(0,0,255) );
cv::line(result, cv::Point(x1,y2), cv::Point(x2,y2), cv::Scalar(0,0,255) );
cv::line(result, cv::Point(x2,y2), cv::Point(x2,y1), cv::Scalar(0,0,255) );
cv::line(result, cv::Point(x2,y1), cv::Point(x1,y1), cv::Scalar(0,0,255) );
cv::Mat a = source( cv::Rect(left,top,width,height) );
sprintf(fname,"A%05d.jpg", i);
cv::imwrite(fname,a);
}
cv::namedWindow("SRC");
cv::imshow("SRC", result);
cv::waitKey(-1);
}