Go to the documentation of this file.00001 #include "CvTestbed.h"
00002 #include "ConnectedComponents.h"
00003 #include "Shared.h"
00004 using namespace alvar;
00005 using namespace std;
00006
00007 int thresh_param1 = 31;
00008
00009 void videocallback(IplImage *image)
00010 {
00011 bool flip_image = (image->origin?true:false);
00012 if (flip_image) {
00013 cvFlip(image);
00014 image->origin = !image->origin;
00015 }
00016
00017 static LabelingCvSeq* labeling = 0;
00018 if(!labeling) {
00019 labeling = new LabelingCvSeq();
00020 }
00021
00022 labeling->SetThreshParams(thresh_param1, 5);
00023
00024 const int min_edge_size = 10;
00025 CvSeq* edges = labeling->LabelImage(image, min_edge_size);
00026
00027 int n_edges = edges->total;
00028 for(int i = 0; i < n_edges; ++i)
00029 {
00030 CvSeq* pixels = (CvSeq*)cvGetSeqElem(edges, i);
00031 int n_pixels = pixels->total;
00032 for(int j = 0; j < n_pixels; ++j)
00033 {
00034 CvPoint* pt = (CvPoint*)cvGetSeqElem(pixels, j);
00035 cvLine(image, *pt, *pt, CV_RGB(255,0,0));
00036 }
00037 }
00038
00039
00040 labeling->LabelSquares(image, true);
00041
00042 if (flip_image) {
00043 cvFlip(image);
00044 image->origin = !image->origin;
00045 }
00046 }
00047
00048 int keycallback(int key)
00049 {
00050 if(key == '+')
00051 {
00052 thresh_param1+=2;
00053 std::cout<<"Adaptive threshold block size: "<<thresh_param1<<std::endl;
00054 }
00055 else if(key == '-')
00056 {
00057 thresh_param1-=2;
00058 if(thresh_param1<3) thresh_param1 = 3;
00059 std::cout<<"Adaptive threshold block size: "<<thresh_param1<<std::endl;
00060 }
00061
00062 else return key;
00063
00064 return 0;
00065 }
00066
00067 int main(int argc, char *argv[])
00068 {
00069 try {
00070
00071 std::string filename(argv[0]);
00072 filename = filename.substr(filename.find_last_of('\\') + 1);
00073 std::cout << "SampleLabeling" << std::endl;
00074 std::cout << "==============" << std::endl;
00075 std::cout << std::endl;
00076 std::cout << "Description:" << std::endl;
00077 std::cout << " This is an example of how to use the 'LabelingCvSeq' class to perform" << std::endl;
00078 std::cout << " labeling. Blobs are detected in the image and if the blobs have four" << std::endl;
00079 std::cout << " corners, the edges between the corners are visualized." << std::endl;
00080 std::cout << std::endl;
00081 std::cout << "Usage:" << std::endl;
00082 std::cout << " " << filename << " [device]" << std::endl;
00083 std::cout << std::endl;
00084 std::cout << " device integer selecting device from enumeration list (default 0)" << std::endl;
00085 std::cout << " highgui capture devices are prefered" << std::endl;
00086 std::cout << std::endl;
00087 std::cout << "Keyboard Shortcuts:" << std::endl;
00088 std::cout << " +: Increase adaptive threshold block size." << std::endl;
00089 std::cout << " -: Decrease adaptive threshold block size." << std::endl;
00090 std::cout << " q: quit" << std::endl;
00091 std::cout << std::endl;
00092
00093
00094 CvTestbed::Instance().SetVideoCallback(videocallback);
00095 CvTestbed::Instance().SetKeyCallback(keycallback);
00096
00097
00098 CaptureFactory::CapturePluginVector plugins = CaptureFactory::instance()->enumeratePlugins();
00099 if (plugins.size() < 1) {
00100 std::cout << "Could not find any capture plugins." << std::endl;
00101 return 0;
00102 }
00103
00104
00105 std::cout << "Available Plugins: ";
00106 outputEnumeratedPlugins(plugins);
00107 std::cout << std::endl;
00108
00109
00110 CaptureFactory::CaptureDeviceVector devices = CaptureFactory::instance()->enumerateDevices();
00111 if (devices.size() < 1) {
00112 std::cout << "Could not find any capture devices." << std::endl;
00113 return 0;
00114 }
00115
00116
00117 int selectedDevice = defaultDevice(devices);
00118 if (argc > 1) {
00119 selectedDevice = atoi(argv[1]);
00120 }
00121 if (selectedDevice >= (int)devices.size()) {
00122 selectedDevice = defaultDevice(devices);
00123 }
00124
00125
00126 std::cout << "Enumerated Capture Devices:" << std::endl;
00127 outputEnumeratedDevices(devices, selectedDevice);
00128 std::cout << std::endl;
00129
00130
00131 Capture *cap = CaptureFactory::instance()->createCapture(devices[selectedDevice]);
00132 std::string uniqueName = devices[selectedDevice].uniqueName();
00133
00134
00135
00136 if (cap) {
00137 std::stringstream settingsFilename;
00138 settingsFilename << "camera_settings_" << uniqueName << ".xml";
00139
00140 cap->start();
00141 cap->setResolution(640, 480);
00142
00143 if (cap->loadSettings(settingsFilename.str())) {
00144 std::cout << "Loading settings: " << settingsFilename.str() << std::endl;
00145 }
00146
00147 std::stringstream title;
00148 title << "SampleLabeling (" << cap->captureDevice().captureType() << ")";
00149
00150 CvTestbed::Instance().StartVideo(cap, title.str().c_str());
00151
00152 if (cap->saveSettings(settingsFilename.str())) {
00153 std::cout << "Saving settings: " << settingsFilename.str() << std::endl;
00154 }
00155
00156 cap->stop();
00157 delete cap;
00158 }
00159 else if (CvTestbed::Instance().StartVideo(0, argv[0])) {
00160 }
00161 else {
00162 std::cout << "Could not initialize the selected capture backend." << std::endl;
00163 }
00164
00165 return 0;
00166 }
00167 catch (const std::exception &e) {
00168 std::cout << "Exception: " << e.what() << endl;
00169 }
00170 catch (...) {
00171 std::cout << "Exception: unknown" << std::endl;
00172 }
00173 }