ok, kdyz to pomuze. Ale v kodu chyba neni, na jinem systemu je bezproblemu prelozitelny.
#define VISUAL_OUTPUT 0
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <iostream>
#include <sstream>
using namespace std;
using namespace cv;
void fillCheckerboard( Mat img);
Mat lazyConvertToGray(Mat img);
Mat customNonlinearFilter( Mat img, const float angle);
Mat convertToGray( Mat img);
char changeColor(char color);
int main( int argc, char* argv[])
{
string inputImageName;
string inputVideoName;
string outputDirectory;
uint64 randSeed = 0;
// zpracovani parametru prikazove radky
for( int i = 1; i < argc; i++){
if( string(argv[ i]) == "-ii" && i + 1 < argc){
inputImageName = argv[ ++i];
} else if( string(argv[ i]) == "-iv" && i + 1 < argc){
inputVideoName = argv[ ++i];
} else if( string(argv[ i]) == "-od" && i + 1 < argc){
outputDirectory = argv[ ++i];
} else if( string(argv[ i]) == "-s" && i + 1 < argc){
stringstream str( argv[ i]);
str >> randSeed;
} else if( string(argv[ i]) == "-h"){
cout << "Use: " << argv[0] << " -ii inputImageName -iv inputVideoName [-od outputDirectory -s randSeed]" << endl;
return 0;
} else {
cerr << "Error: Unrecognized command line parameter \"" << argv[ i] << "\" use -h to get more information." << endl;
}
}
if( inputImageName.empty() || inputVideoName.empty()){
cerr << "Error: Some mandatory command line options were not specified." << endl;
return -1;
}
RNG rndGen( randSeed);
Mat inputImage;
inputImage = imread(inputImageName, CV_LOAD_IMAGE_COLOR);
if( inputImage.data == NULL) {
cerr << "Error: Failed to read image file \"" << inputImageName << "\"." << endl;
getchar();
return -1;
}
if( (inputImage.channels() != 1 && inputImage.channels() != 3) || inputImage.depth() != CV_8U){
cerr << "Error: Input image has wrong format." << endl;
getchar();
return -1;
}
if( (inputImage.cols < 300) || (inputImage.rows < 250)){
cerr << "Error: Input image is too smal." << endl;
getchar();
return -1;
}
Mat grayImage = lazyConvertToGray(inputImage);
Mat roiImage (grayImage, Rect(
100,
25,
50,
150));
fillCheckerboard(roiImage);
Mat checkerboardCopy;
checkerboardCopy = roiImage.clone();
Size velikost(11,11);
GaussianBlur(grayImage, grayImage, velikost, 2, 2, BORDER_DEFAULT);
imwrite( outputDirectory + "checkerboard.jpg", checkerboardCopy);
if( VISUAL_OUTPUT){
imshow( "Checkerboard", checkerboardCopy);
waitKey();
}
Mat resizedImage;
Size size(200,200);
resize(grayImage, resizedImage, Size(200,200), 0, 0, INTER_NEAREST);
for( int i = 0; i <= 9; i++){
Mat filteredImage = customNonlinearFilter( resizedImage, 2 * 3.14 / 10 * i);
Mat outImage;
normalize(filteredImage, outImage, 0, 255, NORM_INF ,CV_8U);
stringstream str("");
str << "Filtered_" << i;
string name = outputDirectory + str.str() + ".jpg";
cout<<name<<endl;
imwrite( name, outImage);
if( VISUAL_OUTPUT){
stringstream str;
str << "Filtered_" << i;
imshow( str.str(), outImage);
}
}
// Otevreni videa
VideoCapture capture( inputVideoName);
if( !capture.isOpened()){
cerr << "Error: Unable to open input video file \"" << inputVideoName << "\"." << endl;
return -1;
}
cout << "Video " << inputVideoName << "\twidth " << capture.get(CV_CAP_PROP_FRAME_WIDTH) << "\theight " << capture.get(CV_CAP_PROP_FRAME_HEIGHT) << "\tFPS " << capture.get(CV_CAP_PROP_FPS) << "\tframe_count " << capture.get(CV_CAP_PROP_FRAME_COUNT) << endl;
const string outputVideoName = outputDirectory + "videoOut.avi";
Size sizeFrame(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT));
VideoWriter writer(outputVideoName, capture.get(CV_CAP_PROP_FOURCC), capture.get(CV_CAP_PROP_FPS), sizeFrame, true);
if( !writer.isOpened()){
cerr << "Error: Unable to open output video file \"" << outputVideoName << "\"." << endl;
return -1;
}
bool finished = false;
while( !finished){
Mat frame;
bool success = false;
capture >> frame;
if(!frame.empty()){
success = true;
}
finished |= !success;
if( success){
StarFeatureDetector detector( 32);
vector<KeyPoint> keypoints;
Mat grayFrame = lazyConvertToGray(frame);
detector.detect( frame, keypoints);
for( int i = 0; i < (int) keypoints.size(); i++){
circle(frame, keypoints[i].pt, (int) keypoints[i].size, Scalar(255), 1, 8, 0);
}
writer.write(frame);
if( VISUAL_OUTPUT){
imshow( "Local features", frame);
switch( waitKey( 2)){
case 'x':
case 'X':
case 'q':
case 'Q':
finished = true;
break;
}
}
}
}
Mat A(100000, 4, CV_64F);
rndGen.fill( A, RNG::NORMAL, Scalar( 0), Scalar( 1));
Mat covM = (A.t()*A)/A.rows;
cout << covM;
}
Mat lazyConvertToGray(Mat img){
Mat grayImg;
if( img.channels() == 1){
img.copyTo(grayImg);
} else {
cvtColor(img, grayImg, CV_BGR2GRAY);
}
return grayImg;
}
char changeColor(char color){
if(color == (char)255){
color = 0;
}else{
color = 255;
}
return color;
}
void fillCheckerboard( Mat img)
{
if((img.cols % 3 != 0) || (img.rows % 6 != 0)){
cerr << "Sachovnice nebude uplna!"<< endl;
}
char color = 255;
int count = 1;
bool black = true;
for(int x = 0; x < img.cols; x++){
for(int y = 0; y < img.rows; y++){
if((y % 6) == 0){
color = changeColor(color);
}
img.at<char>(y,x)= color;
}
color = 255;
if(black == false){
color = changeColor(color);
}
count++;
if(count%3 == 0){
if(black == true)
black = false;
else
black = true;
}
}
}
Mat customNonlinearFilter( Mat img, float angle)
{
const float e = 50;
float horKernelPtr[3] = {-0.5, 0, 0.5};
Mat horKernel( 1, 3, CV_32F, horKernelPtr);
Mat verKernel = horKernel.t(); // transpozice
Mat I_dx, I_dy;
filter2D(img, I_dx, CV_32F, horKernel, Point(-1,-1), 0, BORDER_DEFAULT );
filter2D(img, I_dy, CV_32F, verKernel, Point(-1,-1), 0, BORDER_DEFAULT );
Mat I_m, I_o;
cartToPolar(I_dx, I_dy, I_m, I_o);
Mat ADiff(I_o);
float diff;
for(int x = 0; x < ADiff.cols; x++){
for(int y = 0; y < ADiff.rows; y++){
diff = I_o.at<float>(x,y) - angle;
if( diff < -3.14){
diff = 2 * 3.14 + diff;
} else if( diff > 3.14){
diff = 2 * 3.14 - diff;
}
ADiff.at<float>(x,y)=abs(diff);
}
}
ADiff = -2 * ADiff;
Mat EADiff;
exp( ADiff, EADiff);
Mat I_mG;
GaussianBlur(EADiff, I_mG, Size(19,19), 6, 0, BORDER_DEFAULT);
Mat result = (I_m.mul(EADiff))/(I_mG + e);
return result;
}