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

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

超解像(superres)、OpenCV 3.0だとだめっぽい。2.4.8での結果。

超解像OpenCV 3.0.0-devでコンパイルエラーを引き起こす。

ということで、2.4.8での動作結果を。

 

f:id:anobiidae:20140314212550p:plain

 

上が低解像度な元画像、で、下が超解像処理をした結果。

こうしてみると左のペンギンのひれ部分がなだからかだったり、色々差があると。

 

OpenCVで使うときの問題は、「動画ファイルかカメラを入力にしないといけない」ということ。つまり、静止画群じゃ処理できないので、仕方が無くこんな感じにやりました、っと。

 

ソースコードはこちら。

#include <opencv/cv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/superres/superres.hpp>
#include 

#define CV_FOURCC_MACRO(c1, c2, c3, c4) (((c1) & 255) + (((c2) & 255) << 8) + (((c3) & 255) << 16) + (((c4) & 255) << 24))

std::vector splitImage(cv::Mat src){
    std::vector < cv::Mat > ret;
	int divNum=8;
	int celRows = src.rows / divNum;
	int celCols = src.cols / divNum;

	for(int cx=0;cx<divNum;cx++){
		for(int cy=0;cy<divNum;cy++){
			cv::Mat dst(celRows, celCols, CV_8UC3 );
			for(int dx=0;dx<celRows;dx++){
				for(int dy=0;dy<celCols;dy++){
					for(int ch=0;ch<3;ch++){
						dst.at(dx,dy)[ch] = 
						src.at(dx * divNum + cx, dy * divNum + cy)[ch];
					}
				}
			}
			ret.push_back(dst);
		}
	}
	return ret;
}

void createVideo(std::vector src ){
	cv::VideoWriter videoDevice("output.avi", 
		CV_FOURCC_MACRO('I','4','2','0'), 29.97, cv::Size(128,96) );

	for(int m=0;m<1;m++){
		for(int i=0;i<src.size();i++){
		videoDevice << src[i];
		}
	}

	videoDevice.release();
}

int main(){
	std::vector images = splitImage(cv::imread("Penguins.jpg"));
	createVideo(images);

	int scale = 2;

	cv::Ptr  inst =
		cv::superres::createSuperResolution_BTVL1();

	inst->setInput(cv::superres::createFrameSource_Video("./output.avi"));
	inst->set("iterations", 200);
	inst->set("scale", scale);

	cv::namedWindow("result");
	cv::namedWindow("src");
	for(int i=0;i<images.size() ;i++){
		cv::Mat dst;
		inst->nextFrame(dst);
		cv::Mat scaledImage ;
		cv::resize(images[i % images.size()], scaledImage, dst.size() , 1,1);
		cv::imshow("src", scaledImage);
		cv::imshow("result", dst);
		cv::waitKey(30);
	//	cv::waitKey(-1);
	}

	return 0;
}