Subversion Repositories seema-scanner

Rev

Rev 20 | Rev 27 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 20 Rev 23
Line 4... Line 4...
4
#include <QTime>
4
#include <QTime>
5
#include <QSettings>
5
#include <QSettings>
6
 
6
 
7
void SMCaptureWorker::setup(){
7
void SMCaptureWorker::setup(){
8
 
8
 
9
    // Create cameras
9
    // Create projector
10
    QSettings settings;
10
    QSettings settings;
-
 
11
    int screenNum = settings.value("projector/screenNumber", -1).toInt();
-
 
12
    if(screenNum != -1)
-
 
13
        projector = new ProjectorOpenGL(screenNum);
-
 
14
 
-
 
15
    // Create cameras
11
    int iNum0 = settings.value("camera0/interfaceNumber", -1).toInt();
16
    int iNum0 = settings.value("camera0/interfaceNumber", -1).toInt();
12
    int cNum0 = settings.value("camera0/cameraNumber", -1).toInt();
17
    int cNum0 = settings.value("camera0/cameraNumber", -1).toInt();
13
    if(iNum0 != -1)
18
    if(iNum0 != -1)
14
        camera0 = Camera::NewCamera(iNum0,cNum0);
19
        camera0 = Camera::NewCamera(iNum0,cNum0,triggerModeSoftware);
15
 
20
 
16
    int iNum1 = settings.value("camera1/interfaceNumber", -1).toInt();
21
    int iNum1 = settings.value("camera1/interfaceNumber", -1).toInt();
17
    int cNum1 = settings.value("camera1/cameraNumber", -1).toInt();
22
    int cNum1 = settings.value("camera1/cameraNumber", -1).toInt();
18
    if(iNum1 != -1)
23
    if(iNum1 != -1)
19
        camera1 = Camera::NewCamera(iNum1,cNum1);
24
        camera1 = Camera::NewCamera(iNum1,cNum1,triggerModeSoftware);
20
 
25
 
21
    // Set camera settings
26
    // Set camera settings
22
    CameraSettings cameraSettings;
27
    CameraSettings cameraSettings;
23
    cameraSettings.shutter = settings.value("camera/shutter", 16.666).toFloat();
28
    cameraSettings.shutter = settings.value("camera/shutter", 16.666).toFloat();
24
    cameraSettings.gain = 0.0;
29
    cameraSettings.gain = 0.0;
25
 
30
 
26
    camera0->setCameraSettings(cameraSettings);
31
    camera0->setCameraSettings(cameraSettings);
27
    camera1->setCameraSettings(cameraSettings);
32
    camera1->setCameraSettings(cameraSettings);
28
 
33
 
29
    // Read trigger configuration
34
    // Start capturing
30
    QString sTriggerMode = settings.value("trigger/mode", "Hardware").toString();
-
 
31
    if(sTriggerMode == "hardware")
35
    camera0->startCapture();
32
        triggerMode = triggerModeHardware;
36
    camera1->startCapture();
-
 
37
 
33
    else if(sTriggerMode == "software")
38
    // Create rotation stage
34
        triggerMode = triggerModeSoftware;
39
    rotationStage = new RotationStage();
35
    else
-
 
36
        std::cerr << "SLScanWorker: invalid trigger mode " << sTriggerMode.toStdString() << std::endl;
-
 
37
}
40
}
38
 
41
 
39
 
42
 
40
void SMCaptureWorker::doWork(){
43
void SMCaptureWorker::doWork(){
41
 
44
 
42
    unsigned int k=0;
45
    projector->displayWhite();
43
 
46
 
44
    QTime time; time.start();
-
 
45
 
-
 
46
    isWorking = true;
47
    working = true;
47
 
-
 
48
    if(triggerMode == triggerModeHardware){
-
 
49
        camera0->startCapture();
-
 
50
        camera1->startCapture();
-
 
51
    }
-
 
52
 
-
 
53
    std::vector<Camera*> cameras;
-
 
54
    cameras.push_back(camera0);
-
 
55
    cameras.push_back(camera1);
-
 
56
 
48
 
57
    // Processing loop
49
    // Processing loop
-
 
50
    QTime time;
-
 
51
    time.start();
58
    while(isWorking){
52
    while(working){
59
 
53
 
60
        std::vector<cv::Mat> frameSet;
54
        std::vector<cv::Mat> frameSet;
61
 
55
 
62
        CameraFrame frame;
56
        CameraFrame frame;
63
 
57
 
64
        for(int c=0; c<2; c++){
-
 
65
            if(triggerMode == triggerModeHardware)
-
 
66
                frame = cameras[c]->lockFrame();
-
 
67
            else
58
        // trigger cameras
68
                frame = cameras[c]->getSingleFrame();
-
 
69
            cv::Mat frameCV(frame.height, frame.width, CV_16UC3, frame.memory);
-
 
70
            frameCV = frameCV.clone();
-
 
71
            frameSet.push_back(frameCV);
-
 
72
        }
-
 
73
 
-
 
74
        //QTest::qSleep(50);
59
        camera0->trigger();
75
 
-
 
76
        // Pass frame sequence to decoder
-
 
77
        emit newFrameSet(frameSet);
60
        camera1->trigger();
78
 
-
 
79
        // Increase iteration counter
-
 
80
        k += 1;
-
 
81
 
61
 
-
 
62
        // retrieve frames
-
 
63
        frame = camera0->getFrame();
-
 
64
        cv::Mat frameCV;
82
        std::cout << "Capture worker " << time.restart() << "ms" << std::endl;
65
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
-
 
66
        frameCV = frameCV.clone();
-
 
67
        frameSet.push_back(frameCV);
83
 
68
 
84
//        cv::imwrite("frameSet0.png",frameSet[0]);
69
        emit newFrame(0, frameCV);
85
//        cv::imwrite("frameSet1.png",frameSet[1]);
-
 
86
 
70
 
-
 
71
        frame = camera1->getFrame();
-
 
72
        frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
87
        // Process events e.g. check for exit flag
73
        frameCV = frameCV.clone();
88
        QCoreApplication::processEvents();
74
        frameSet.push_back(frameCV);
89
 
75
 
90
    }
76
        emit newFrame(1, frameCV);
91
 
77
 
92
    if(triggerMode == triggerModeHardware){
78
        //std::cout << "SMCaptureWorker idle " << time.restart() << "ms" << std::endl;
-
 
79
 
93
        for(unsigned int i=0; i<cameras.size(); i++){
80
        // Process events e.g. perform a task
94
            cameras[i]->stopCapture();
81
        QCoreApplication::processEvents();
95
        }
-
 
96
    }
82
    }
97
 
83
 
98
    // Emit message to e.g. initiate thread break down
-
 
99
    emit finished();
84
    emit finished();
-
 
85
}
100
 
86
 
-
 
87
void SMCaptureWorker::rotateTo(float angle){
-
 
88
 
-
 
89
    std::cout << "Moving to: " << angle << std::endl;
-
 
90
    rotationStage->moveAbsolute(angle);
-
 
91
    rotationStage->wait();
101
}
92
}
102
 
93
 
103
void SMCaptureWorker::stopWorking(){
94
void SMCaptureWorker::acquireCalibrationSet(float angle){
-
 
95
    rotateTo(angle);
-
 
96
 
104
    isWorking = false;
97
    CameraFrame frame;
-
 
98
    CalibrationSet calibrationSet;
-
 
99
 
-
 
100
    // trigger cameras
-
 
101
    camera0->trigger();
-
 
102
    camera1->trigger();
-
 
103
 
-
 
104
    // retrieve frames
-
 
105
    frame = camera0->getFrame();
-
 
106
    cv::Mat frameCV;
-
 
107
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
-
 
108
    frameCV = frameCV.clone();
-
 
109
 
-
 
110
    calibrationSet.frame0 = frameCV;
-
 
111
 
-
 
112
    frame = camera1->getFrame();
-
 
113
    frameCV  = cv::Mat(frame.height, frame.width, CV_8UC3, frame.memory);
-
 
114
    frameCV = frameCV.clone();
-
 
115
 
-
 
116
    calibrationSet.frame1 = frameCV;
-
 
117
 
-
 
118
    calibrationSet.rotationAngle = angle;
-
 
119
 
-
 
120
    emit newCalibrationSet(calibrationSet);
105
}
121
}
106
 
122
 
-
 
123
void SMCaptureWorker::acquireCalibrationSets(std::vector<float> angles){}
-
 
124
 
-
 
125
void SMCaptureWorker::acquireFrameSequence(float angle){}
-
 
126
void SMCaptureWorker::acquireFrameSequences(std::vector<float> angles){}
-
 
127
 
-
 
128
void SMCaptureWorker::abort(){}
-
 
129
 
-
 
130
void SMCaptureWorker::stopWork(){
-
 
131
    working = false;
-
 
132
}
107
 
133
 
108
SMCaptureWorker::~SMCaptureWorker(){
134
SMCaptureWorker::~SMCaptureWorker(){
-
 
135
    delete projector;
109
    delete camera0;
136
    delete camera0;
110
    delete camera1;
137
    delete camera1;
-
 
138
    delete rotationStage;
111
}
139
}