/* openpnp test application Niels Moseley */ #include #include #include #include #include #include "openpnp-capture.h" #include "../common/context.h" std::string FourCCToString(uint32_t fourcc) { std::string v; for(uint32_t i=0; i<4; i++) { v += static_cast(fourcc & 0xFF); fourcc >>= 8; } return v; } bool writeBufferAsPPM(uint32_t frameNum, uint32_t width, uint32_t height, const uint8_t *bufferPtr, size_t bytes) { char fname[100]; sprintf(fname, "frame_%d.ppm",frameNum); FILE *fout = fopen(fname, "wb"); if (fout == 0) { fprintf(stderr, "Cannot open %s for writing\n", fname); return false; } fprintf(fout, "P6 %d %d 255\n", width, height); // PGM header fwrite(bufferPtr, 1, bytes, fout); fclose(fout); return true; } void estimateFrameRate(CapContext ctx, int32_t streamID) { std::chrono::time_point tstart, tend; tstart = std::chrono::system_clock::now(); uint32_t fstart = Cap_getStreamFrameCount(ctx, streamID); usleep(2000000); // 2-second wait uint32_t fend = Cap_getStreamFrameCount(ctx, streamID); tend = std::chrono::system_clock::now(); std::chrono::duration fsec = tend-tstart; uint32_t frames = fend - fstart; printf("Frames = %d\n", frames); std::chrono::milliseconds d = std::chrono::duration_cast(fsec); printf("Measured fps=%5.2f\n", 1000.0f*frames/static_cast(d.count())); } int main(int argc, char*argv[]) { uint32_t deviceFormatID = 0; uint32_t deviceID = 0; printf("OpenPNP Capture Test Program\n"); printf("%s\n", Cap_getLibraryVersion()); Cap_setLogLevel(7); if (argc >= 2) { deviceID = atoi(argv[1]); } if (argc >= 3) { deviceFormatID = atoi(argv[2]); } CapContext ctx = Cap_createContext(); uint32_t deviceCount = Cap_getDeviceCount(ctx); printf("Number of devices: %d\n", deviceCount); for(uint32_t i=0; i %s\n", i, Cap_getDeviceName(ctx,i)); // show all supported frame buffer formats int32_t nFormats = Cap_getNumFormats(ctx, i); printf(" Number of formats: %d\n", nFormats); std::string fourccString; for(int32_t j=0; j m_buffer; m_buffer.resize(finfo.width*finfo.height*3); printf("Use the following keys:\n"); printf(" +/- : change the exposure\n"); printf(" 0 : set exposure to 0\n"); printf(" f/g : change the focus\n"); printf(" z/x : change the zoom\n"); printf(" [/] : change the white balance\n"); printf(" a/s : change the gain\n"); printf(" p : estimate the frame rate\n"); printf(" w : write one frame to a PPM file\n"); printf(" q : quit\n"); char c = 0; int32_t v = 0; uint32_t frameWriteCounter=0; while((c != 'q') && (c != 'Q')) { c = getchar(); //fgets(&c, 1, stdin); switch(c) { case '+': printf("+"); Cap_setProperty(ctx, streamID, CAPPROPID_EXPOSURE, ++v); break; case '-': printf("-"); Cap_setProperty(ctx, streamID, CAPPROPID_EXPOSURE, --v); break; case '0': printf("0"); v = 0; Cap_setProperty(ctx, streamID, CAPPROPID_EXPOSURE, v); break; case 'f': Cap_setProperty(ctx, streamID, CAPPROPID_FOCUS, ++focus); printf("focus = %d \r", focus); break; case 'g': Cap_setProperty(ctx, streamID, CAPPROPID_FOCUS, --focus); printf("focus = %d \r", focus); break; case 'z': Cap_setProperty(ctx, streamID, CAPPROPID_ZOOM, ++zoom); printf("zoom = %d \r", zoom); break; case 'x': Cap_setProperty(ctx, streamID, CAPPROPID_ZOOM, --zoom); printf("zoom = %d \r", zoom); break; case '3': //Cap_setFrameRate(ctx, streamID, --fps); //printf("framerate = %d\n", fps); //break; case '4': //Cap_setFrameRate(ctx, streamID, ++fps); //printf("framerate = %d\n", fps); break; case '[': wbalance -= wbstep; Cap_setProperty(ctx, streamID, CAPPROPID_WHITEBALANCE, wbalance); printf("wbal = %d \r", wbalance); break; case ']': wbalance += wbstep; Cap_setProperty(ctx, streamID, CAPPROPID_WHITEBALANCE, wbalance); printf("wbal = %d \r", wbalance); break; case 'a': gain -= gstep; Cap_setProperty(ctx, streamID, CAPPROPID_GAIN, gain); printf("gain = %d \r", gain); break; case 's': gain += gstep; Cap_setProperty(ctx, streamID, CAPPROPID_GAIN, gain); printf("gain = %d \r", gain); break; case 'p': printf("Estimating frame rate..\n"); estimateFrameRate(ctx, streamID); break; case 'w': if (Cap_captureFrame(ctx, streamID, &m_buffer[0], m_buffer.size()) == CAPRESULT_OK) { if (writeBufferAsPPM(frameWriteCounter, finfo.width, finfo.height, &m_buffer[0], m_buffer.size())) { printf("Written frame to frame_%d.ppm\n", frameWriteCounter++); } } break; } } Cap_closeStream(ctx, streamID); CapResult result = Cap_releaseContext(ctx); return 0; }