OpenCV 3.0に果敢に挑戦し続けてみる

個人的な趣味の一環として、OpenCV 3.0がらみの情報をまとめてみる。「引用はいぃんよー、無断転載はあかんよー」ということで。

ばらばら殺ぺんぎん事件(OpenCVでStitchingしてみるか)

はい、物騒なタイトルついてますが、stitchingになります。

ソースは下記のペンギンさんの画像の赤枠部分(256×256が20枚)です。

f:id:anobiidae:20140301132231p:plain

画像縮小しちゃったけど、こんな感じの20枚

f:id:anobiidae:20140301175701j:plain

 

結果は、こちら

f:id:anobiidae:20140301132334j:plain

 

ふむ、とてもよい感じ…パフォーマンスを除けば。

…と思ったら、あれ?右下とか復元できてないような?

 

ソースはこの下。

 #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);

}