Здорова господа!!!
Рассмотрим библиотеку компьютерного зрения openCV. Мне нужны были функции масштабирования изображения формата jpg и jpeg, заюзал openCV. Вообще эта библиотека огромная и по ней есть целая книга, но мы рассмотрим только кое какие функции которые я использовал для масштабирования изображения.
[tip]OpenCV (англ. Open Source Computer Vision Library, библиотека компьютерного зрения с открытым исходным кодом) — библиотека алгоритмов компьютерного зрения, обработки изображений и численных алгоритмов общего назначения с открытым кодом. Реализована на C/C++, также разрабатывается для Python, Java, Ruby, Matlab, Lua и других языков. Может свободно использоваться в академических и коммерческих целях — распространяется в условиях лицензии BSD.[/tip]
1. Установка и подключение.
Скачиваем библиотеку последнюю версию отсюда: http://sourceforge.net/projects/opencvlibrary/
[tip]
Увы по ссылке выше в новой версии openCV уже нету либ для vs2010 поэтому скачиваем например эту версию где она есть ссылка
[/tip]
Дальше запускаем установщик программы и я точно не помню но все вроде по умолчанию оставляем и он просто устанавливается. Дальше
- Прописываем в visual studio 2010 путь к каталогу c:opencv\build\include\opencv\ и opencv/build/include/ это во вкладке: каталоги VC++ -> каталоги включения.
- Прописываем пути в visual studio 2010 путь к каталогу c:\opencv\build\x86\vc10\lib\ во вкладке VC++ -> каталоги библиотек.
- Дальше заходим на вкладку Компоновщик -> ввод -> каталоги исполняемых файлов, там прописываем подключаемые библиотеки: opencv_core246.lib, opencv_imgproc246.lib, opencv_highgui246.lib, opencv_ml246.lib, opencv_video246.lib. Это для релиза, для дебага нужно прописывать с буковкой d в конце имени.
- Ну и можно файлы из каталога c:\opencv\build\x86\vc10\bin имеется введу .dll все, покопировать в папку windows/System32, я так делал и повторюсь это не правильное решение, нужно их не копировать а подключать к проекту прописав пути к этой папке в настройках проекта, ну да ладно я скопировал, кто шарит, тот и так знает как подключить либу, это я уже для полнейших новичков объясняю как делать.
И дальше для того что бы использовать в проекте openCV нужно подключать соответствующие заголовочные файлы например:
1 2 3 |
//Подключение openCV #include <cv.h> #include <highgui.h> |
2. Простейший пример использования.
Я попытаюсь привести пример с функцией которую я использую для масштабирования.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
/* $Id$ */ #include <iostream> using std::cout; using std::endl; using std::cerr; #include <string> using std::string; #include <fstream> using std::ifstream; using std::ofstream; #include <stdlib.h> #include <sstream> using std::stringstream; #include <regex> using std::regex_search; using std::regex; using std::smatch; #include "gd.h" #pragma comment(lib,"libgd.lib") #include "curl/curl.h" #pragma comment(lib,"curllib.lib") //Подключение openCV #include <cv.h> #include <highgui.h> #include <stdio.h> //создаем функцию для записи static size_t my_fun(char* ptr,size_t size, size_t nmemb, string* str) { if(str) { //размещает в блоке памяти размером size*nmemb данные из ptr (видимо) str->append(ptr,size*nmemb); return size*nmemb; } else return 0;//ошибка } bool resizeimg_jpeg_jpg(string& nameImg, string& content,double w=300,double h=300,double wn=20,double hn=20) { IplImage* image = 0; IplImage* dest=0; //1. извлекаем имя smatch sm; if(regex_search(nameImg,sm,regex(".+\\.jpeg.*",std::regex_constants::icase))) { ofstream ofs("temp.jpg",ofstream::out|ofstream::binary); if(!ofs) { cerr <<"don't open file (function: 'resize_jpeg_jpg' 1"<<endl;exit(1); } ofs <<content; ofs.close(); image = cvLoadImage("temp.jpeg",1); } else if(regex_search(nameImg,sm,regex(".+\\.jpg.*",std::regex_constants::icase))) { ofstream ofs("temp.jpg",ofstream::out|ofstream::binary); if(!ofs) { cerr <<"don't open file (function: 'resize_jpeg_jpg' 1"<<endl;exit(1); } ofs <<content; ofs.close(); image = cvLoadImage("temp.jpg",1); } else { cout <<"not find: jpeg|jpg"<<endl; return false; } if(image==0) return false; double width=image->width; //ширина текущего изображения double height=image->height; //высота текущего изображения //если размеры меньше меньшего изображения, то возвращаем false (копирование не нужно) if(width<wn||height<hn) { cvReleaseImage(&image);//разрушаем изображение и выходим из функции return false; } //если размеры меньше максимального предела, то маштабирование не нужно, просто сохраняем изображение if(width<w&&height<h) { //сохраняем изображение на диск cvSaveImage(nameImg.c_str(),image); cvReleaseImage(&image); return true; } //Изображение больше, его нужно маштабировать(уменьшить) //Вычисляем размеры уменьшеной копии, чтобы при масштабировании //сохранились пропорции исходного изображения double ratio=w/h; //коефициент сжатия double src_ratio=width/height;//коэфициент маштабирования if(ratio<src_ratio) h=w/src_ratio; else w=h*src_ratio; //создаем новое изображение dest=cvCreateImage( cvSize(width, height), image->depth, image->nChannels ); if(dest==0) return false; cvResize(image, dest, 1); //сохранить новое изображение cvSaveImage(nameImg.c_str(),dest); //сохраняем изображение на диск cvReleaseImage(&image); //освобождаем ресурсы cvReleaseImage(&dest); return true; } int main() { CURL* curl; CURLcode res; string content; curl=curl_easy_init(); if(curl) { //http://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Animal_diversity.png/265px-Animal_diversity.png //http://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Animal_diversity.png/265px-Animal_diversity.png curl_easy_setopt(curl,CURLOPT_URL,"http://robocraft.ru/uploads/images/store/40/08/fc/1/d0f5eb_preview.jpg"); curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,my_fun); curl_easy_setopt(curl,CURLOPT_WRITEDATA,&content); res=curl_easy_perform(curl); if(res==CURLE_OK)cout <<"\nDone!"<<endl; else cout <<"curl_easy_perform failed: "<<curl_easy_strerror(res)<<endl; curl_easy_cleanup(curl); } //в content string nameImg="my_img1.jpg"; if(content.size()!=0) resizeimg_jpeg_jpg(nameImg,content); else if(content.size()==0) cout <<"content.size()= "<<content.size()<<endl; return 0; } |
Эта функция масштабирует изображение, уменьшает его размеры, тут она принимает один единственный тип, то есть два jpeg и jpg, но это одн и тот же формат. Расписывать не хочу как она работает, там с кода все понятно. Лень просто.
Скажу что библиотека мощная, но там от нету жаль обработки формата gif, поэтому мне пришлось использовать гамно-библиотеку gdlib которая криво работает, а точнее половина функций не работает.
[youtube]http://www.youtube.com/watch?v=NsALnAuD09k[/youtube]
Руководство написано на тяп-ляп, автору дизлайк!
Как написано извини, щас помоему новый openCV вышел. Я давно его не устанавливал, если надо было я по этому руководству без проблем устанавливал