Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / colonet / server / vision / shmservetest.cpp @ 939

History | View | Annotate | Download (2.94 KB)

1
#include <cv.h>
2
#include <highgui.h>
3

    
4
#include <stdio.h>
5

    
6
#define CAPTURE
7

    
8
#ifdef CAPTURE
9
static CvCapture *capture;
10
#endif
11

    
12
#include <sys/types.h>
13
#include <sys/shm.h>
14
#include <string.h>
15
#include <stdlib.h>
16

    
17
#include "php_sysvsem.h"
18

    
19
#include <errno.h>
20

    
21
int write_JPEG_to_mem (unsigned char *storage, int length, IplImage *_img, int quality);
22

    
23
static sysvsem *sem;
24
static int shm_id;
25

    
26
int sendImage(IplImage *image)
27
{
28
  printf("Send image\n");
29

    
30
        if (sem->sem_acquire())
31
        {
32
                printf("Semaphore acquired\n");
33

    
34
                unsigned char *p = (unsigned char *)shmat(shm_id, NULL, 0);
35
                if (p!=(void *)-1)
36
                {
37
                        printf("Memory mapped at %p\n", p);
38

    
39
                        int len = write_JPEG_to_mem (p+4, 150000-4, image, 30);
40

    
41
                        int i;
42
                        int length = len;
43
                        printf("%d\n", length);
44
                        for(i=0; i < 4; i++)
45
                        {
46
                                char digit = (char)(length & 0xff);
47
                                length >>= 8;
48
                                memcpy(p+i, &digit, sizeof(char));
49
                        }
50

    
51
                        printf("Memory copied\n");
52
                        
53
                        sem->sem_release();
54
                        printf("Semaphore released\n");
55
                        
56
                        shmdt(p);
57
                  printf("Memory detached\n");
58
                }
59
        }
60

    
61
  if (errno!=0)
62
  {
63
    int errnum = errno;
64
    errno = 0;
65
    
66
    fprintf(stderr, "error %d %s\n", errnum, strerror(errnum));
67
    return errnum;
68
  }
69
  
70
  return 0;
71
}
72

    
73
void openShM()
74
{
75
        shm_id = shmget(0x40305163, 150000, IPC_CREAT | 0666);
76
        if (shm_id > 0)
77
                printf("Shared memory opened\n");
78
        else
79
        {
80
                fprintf(stderr, "Error opening shared memory\n");
81
                exit(-2);
82
        }
83
                
84
  sem = new (std::nothrow)sysvsem(0x40309999);
85
  if (sem)
86
                printf("Semaphore opened\n");
87
        else
88
        {
89
                fprintf(stderr, "Error opening semaphore\n");
90
                exit(-1);
91
        }
92
}
93

    
94
void releaseShM()
95
{
96
  sem->sem_remove();
97
        delete sem;
98
        printf("Semaphore deleted\n");
99

    
100
  shmctl(shm_id, IPC_RMID, NULL);
101
  printf("Memory marked for deletion\n");
102
}
103

    
104
int main(int argc, char *argv[])
105
{
106
#ifdef CAPTURE
107
  capture = cvCaptureFromCAM( 0 );
108
  if( !capture ) {
109
    fprintf( stderr, "ERROR: capture is NULL \n" );
110
    return -1;         
111
  }
112
#endif
113

    
114
        openShM();
115

    
116
  // Create a window in which the captured images will be presented
117
  //cvNamedWindow( "mywindow1", CV_WINDOW_AUTOSIZE );
118

    
119
  // Show the image captured from the camera in the window and repeat
120
  while((cvWaitKey(10) & 255) != 27)
121
  {
122
    usleep(15000);
123
    
124
#ifdef CAPTURE
125
    if(!cvGrabFrame(capture)){              // capture a frame
126
      printf("Could not grab a frame\n\7");
127
      return -1;
128
    }
129
    IplImage *image03=cvRetrieveFrame(capture);
130
#else
131
    IplImage *image03;
132
    // load image and force it to be grayscale
133
    if ((image03 = cvLoadImage(argv[1], 0)) == 0) {
134
      fprintf(stderr, "Failed to load image.\n");
135
      return -1;
136
    }
137
#endif
138

    
139
    //cvShowImage( "mywindow1", image03 );
140

    
141
    sendImage(image03);
142

    
143
#ifndef CAPTURE
144
    cvReleaseImage(&image03);
145
#endif
146

    
147
    //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
148
    //remove higher bits using AND operator
149
  }
150

    
151
#ifdef CAPTURE
152
  // Release the capture device housekeeping
153
  cvReleaseCapture( &capture );
154
#endif
155

    
156
  releaseShM();
157
  
158
  cvDestroyWindow( "mywindow1" );
159
  return 0;
160
}