void *ThreadFunc(void *pContext) #endif { unsigned long FrameCompleted, FrameDropped, PacketReceived, PacketMissed; float FrameRate; tPvErr Err; //StatFramesCompleted increments when a queued frame returns with tPvFrame.Status = ePvErrSuccess //StatFramesDropped increments when a queued frame returns with tPvFrame.Status = ePvErrDataMissing //In a situation where a camera returns a frame, but there is no frame queued for it, THESE //STATS DO NOT INCREMENT. tPvFrame.FrameCount increments regardless of host queuing, and is a better measure //for what frame is being returned from the camera. See CameraStart, where we check this parameter, //for the case where a frame is returned from camera with no frame queued on host. while(!GCamera.Abort && ((Err = PvAttrUint32Get(GCamera.Handle,"StatFramesCompleted",&FrameCompleted)) == ePvErrSuccess) && ((Err = PvAttrUint32Get(GCamera.Handle,"StatFramesDropped",&FrameDropped)) == ePvErrSuccess) && ((Err = PvAttrUint32Get(GCamera.Handle,"StatPacketsMissed",&PacketMissed)) == ePvErrSuccess) && ((Err = PvAttrUint32Get(GCamera.Handle,"StatPacketsReceived",&PacketReceived)) == ePvErrSuccess) && ((Err = PvAttrFloat32Get(GCamera.Handle,"StatFrameRate",&FrameRate)) == ePvErrSuccess)) { printf("FrmCmp : %5lu FrmDrp : %5lu PckCmp : %5lu PckMss : %5lu FrmRt : %5.2f\r", FrameCompleted, FrameDropped, PacketReceived, PacketMissed, FrameRate); Sleep(20); } return 0; }
// encode the value of a given attribute in a string bool Value2String(tPvHandle aCamera,const char* aLabel,tPvDatatype aType,char* aString,unsigned long aLength) { switch(aType) { case ePvDatatypeString: { if(!PvAttrStringGet(aCamera,aLabel,aString,aLength,NULL)) return true; else return false; } case ePvDatatypeEnum: { if(!PvAttrEnumGet(aCamera,aLabel,aString,aLength,NULL)) return true; else return false; } case ePvDatatypeUint32: { tPvUint32 lValue; if(!PvAttrUint32Get(aCamera,aLabel,&lValue)) { sprintf(aString,"%lu",lValue); return true; } else return false; } case ePvDatatypeFloat32: { tPvFloat32 lValue; if(!PvAttrFloat32Get(aCamera,aLabel,&lValue)) { sprintf(aString,"%g",lValue); return true; } else return false; } default: return false; } }
// // idlPvAttrFloat32Get // // Get the value of a Float32 attribute // // command line arguments // argv[0]: IN/FLAG debug // argv[1]: IN camera index // argv[2]: IN attribute name // argv[3]: OUT attribute value int idlPvAttrFloat32Get (int argc, char *argv[]) { unsigned long n; unsigned long err; IDL_STRING *name; float *value; debug = *(IDL_INT *) argv[0]; n = *(unsigned long *) argv[1]; name = (IDL_STRING *) argv[2]; value = (float *) argv[3]; CHECKINDEX(n); err = PvAttrFloat32Get(camera[n], (const char *) IDL_STRING_STR(name), (tPvFloat32 *) value); return idlPvErrCode(err); }
double CvCaptureCAM_PvAPI::getProperty( int property_id ) { tPvUint32 nTemp; switch ( property_id ) { case CV_CAP_PROP_FRAME_WIDTH: PvAttrUint32Get(Camera.Handle, "Width", &nTemp); return (double)nTemp; case CV_CAP_PROP_FRAME_HEIGHT: PvAttrUint32Get(Camera.Handle, "Height", &nTemp); return (double)nTemp; case CV_CAP_PROP_EXPOSURE: PvAttrUint32Get(Camera.Handle,"ExposureValue",&nTemp); return (double)nTemp; case CV_CAP_PROP_FPS: tPvFloat32 nfTemp; PvAttrFloat32Get(Camera.Handle, "StatFrameRate", &nfTemp); return (double)nfTemp; case CV_CAP_PROP_PVAPI_MULTICASTIP: char mEnable[2]; char mIp[11]; PvAttrEnumGet(Camera.Handle,"MulticastEnable",mEnable,sizeof(mEnable),NULL); if (strcmp(mEnable, "Off") == 0) { return -1; } else { long int ip; int a,b,c,d; PvAttrStringGet(Camera.Handle, "MulticastIPAddress",mIp,sizeof(mIp),NULL); sscanf(mIp, "%d.%d.%d.%d", &a, &b, &c, &d); ip = ((a*256 + b)*256 + c)*256 + d; return (double)ip; } case CV_CAP_PROP_GAIN: PvAttrUint32Get(Camera.Handle, "GainValue", &nTemp); return (double)nTemp; } return -1.0; }
// display info on a given attribute of the camera void QueryAttribute(const char* aLabel) { tPvAttributeInfo lInfo; if(!PvAttrInfo(GCamera.Handle,aLabel,&lInfo)) { char lFlags[5]; memset(lFlags,' ',sizeof(char) * 4); if(lInfo.Flags & ePvFlagRead) lFlags[0] = 'r'; if(lInfo.Flags & ePvFlagWrite) lFlags[1] = 'w'; if(lInfo.Flags & ePvFlagVolatile) lFlags[2] = 'v'; if(lInfo.Flags & ePvFlagConst) lFlags[3] = 'c'; lFlags[4] = '\0'; printf("%30s (%30s) [%7s][%s]",aLabel,lInfo.Category,DatatypeToString(lInfo.Datatype),lFlags); switch(lInfo.Datatype) { case ePvDatatypeString: { char lValue[128]; // we assume here that any string value will be less than 128 characters // long, wich we may not be the case if(!PvAttrStringGet(GCamera.Handle,aLabel,lValue,128,NULL)) printf(" = %s\n",lValue); else printf(" = ERROR!\n"); break; } case ePvDatatypeEnum: { char lValue[128]; // we assume here that any string value will be less than 128 characters // long, wich we may not be the case if(!PvAttrEnumGet(GCamera.Handle,aLabel,lValue,128,NULL)) printf(" = %s\n",lValue); else printf(" = ERROR!\n"); break; } case ePvDatatypeUint32: { tPvUint32 lValue; if(!PvAttrUint32Get(GCamera.Handle,aLabel,&lValue)) printf(" = %lu\n",lValue); else printf(" = ERROR!\n"); break; } case ePvDatatypeFloat32: { tPvFloat32 lValue; if(!PvAttrFloat32Get(GCamera.Handle,aLabel,&lValue)) printf(" = %f\n",lValue); else printf(" = ERROR!\n"); break; } default: printf("\n"); } } }
// display info on a given attribute of the camera void QueryAttribute(const char* aLabel) { tPvAttributeInfo lInfo; if(PvAttrInfo(GCamera.Handle,aLabel,&lInfo) == ePvErrSuccess) { char lFlags[5]; memset(lFlags,' ',sizeof(char) * 4); if(lInfo.Flags & ePvFlagRead) lFlags[0] = 'r'; if(lInfo.Flags & ePvFlagWrite) lFlags[1] = 'w'; if(lInfo.Flags & ePvFlagVolatile) lFlags[2] = 'v'; if(lInfo.Flags & ePvFlagConst) lFlags[3] = 'c'; lFlags[4] = '\0'; // printf("%30s (%30s) [%7s]{%s}",aLabel,lInfo.Category,DatatypeToString(lInfo.Datatype),lFlags); // printf("%s/%s = %s [%s]{%s}\n",lInfo.Category,aLabel,lValue,DatatypeToString(lInfo.Datatype),lFlags); switch(lInfo.Datatype) { case ePvDatatypeString: { char lValue[128]; // we assume here that any string value will be less than 128 characters // long, which we may not be the case if(PvAttrStringGet(GCamera.Handle,aLabel,lValue,128,NULL) == ePvErrSuccess) printf("%s/%s = %s [%s,%s]\n",lInfo.Category,aLabel,lValue,DatatypeToString(lInfo.Datatype),lFlags); else printf("ERROR!\n"); break; } case ePvDatatypeEnum: { char lValue[128]; // we assume here that any string value will be less than 128 characters // long, which we may not be the case if(PvAttrEnumGet(GCamera.Handle,aLabel,lValue,128,NULL) == ePvErrSuccess) printf("%s/%s = %s [%s,%s]\n",lInfo.Category,aLabel,lValue,DatatypeToString(lInfo.Datatype),lFlags); else printf("ERROR!\n"); break; } case ePvDatatypeUint32: { tPvUint32 lValue; if(PvAttrUint32Get(GCamera.Handle,aLabel,&lValue) == ePvErrSuccess) printf("%s/%s = %lu [%s,%s]\n",lInfo.Category,aLabel,lValue,DatatypeToString(lInfo.Datatype),lFlags); else printf("ERROR!\n"); break; } case ePvDatatypeInt64: { tPvInt64 lValue; if(PvAttrInt64Get(GCamera.Handle,aLabel,&lValue) == ePvErrSuccess) printf("%s/%s = %lld [%s,%s]\n",lInfo.Category,aLabel,lValue,DatatypeToString(lInfo.Datatype),lFlags); else printf("ERROR!\n"); break; } case ePvDatatypeFloat32: { tPvFloat32 lValue; if(PvAttrFloat32Get(GCamera.Handle,aLabel,&lValue) == ePvErrSuccess) printf("%s/%s = %f [%s,%s]\n",lInfo.Category,aLabel,lValue,DatatypeToString(lInfo.Datatype),lFlags); else printf("ERROR!\n"); break; } case ePvDatatypeBoolean: { tPvBoolean lValue; if(PvAttrBooleanGet(GCamera.Handle,aLabel,&lValue) == ePvErrSuccess) printf("%s/%s = %s [%s,%s]\n",lInfo.Category,aLabel,lValue ? "true" : "false",DatatypeToString(lInfo.Datatype),lFlags); else printf("ERROR!\n"); break; } default: //command printf("%s/%s [%s,%s]\n",lInfo.Category,aLabel,DatatypeToString(lInfo.Datatype),lFlags); } } }
void Camera::getAttribute(const std::string &name, tPvFloat32 &value) { std::string err_msg = "Couldn't get attribute " + name; CHECK_ERR( PvAttrFloat32Get(handle_, name.c_str(), &value), err_msg.c_str()); }
double CvCaptureCAM_PvAPI::getProperty( int property_id ) const { tPvUint32 nTemp; switch ( property_id ) { case CV_CAP_PROP_FRAME_WIDTH: PvAttrUint32Get(Camera.Handle, "Width", &nTemp); return (double)nTemp; case CV_CAP_PROP_FRAME_HEIGHT: PvAttrUint32Get(Camera.Handle, "Height", &nTemp); return (double)nTemp; case CV_CAP_PROP_MONOCROME: if (monocrome) return 1; else return 0; case CV_CAP_PROP_EXPOSURE: PvAttrUint32Get(Camera.Handle,"ExposureValue",&nTemp); return (double)nTemp; case CV_CAP_PROP_FPS: tPvFloat32 nfTemp; PvAttrFloat32Get(Camera.Handle, "StatFrameRate", &nfTemp); return (double)nfTemp; case CV_CAP_PROP_PVAPI_MULTICASTIP: char mEnable[2]; char mIp[11]; PvAttrEnumGet(Camera.Handle,"MulticastEnable",mEnable,sizeof(mEnable),NULL); if (strcmp(mEnable, "Off") == 0) { return -1; } else { long int ip; int a,b,c,d; PvAttrStringGet(Camera.Handle, "MulticastIPAddress",mIp,sizeof(mIp),NULL); sscanf(mIp, "%d.%d.%d.%d", &a, &b, &c, &d); ip = ((a*256 + b)*256 + c)*256 + d; return (double)ip; } case CV_CAP_PROP_GAIN: PvAttrUint32Get(Camera.Handle, "GainValue", &nTemp); return (double)nTemp; case CV_CAP_PROP_PVAPI_FRAMESTARTTRIGGERMODE: char triggerMode[256]; PvAttrEnumGet(Camera.Handle, "FrameStartTriggerMode", triggerMode, 256, NULL); if (strcmp(triggerMode, "Freerun")==0) return 0.0; else if (strcmp(triggerMode, "SyncIn1")==0) return 1.0; else if (strcmp(triggerMode, "SyncIn2")==0) return 2.0; else if (strcmp(triggerMode, "FixedRate")==0) return 3.0; else if (strcmp(triggerMode, "Software")==0) return 4.0; else return -1.0; case CV_CAP_PROP_PVAPI_DECIMATIONHORIZONTAL: PvAttrUint32Get(Camera.Handle, "DecimationHorizontal", &nTemp); return (double)nTemp; case CV_CAP_PROP_PVAPI_DECIMATIONVERTICAL: PvAttrUint32Get(Camera.Handle, "DecimationVertical", &nTemp); return (double)nTemp; case CV_CAP_PROP_PVAPI_BINNINGX: PvAttrUint32Get(Camera.Handle,"BinningX",&nTemp); return (double)nTemp; case CV_CAP_PROP_PVAPI_BINNINGY: PvAttrUint32Get(Camera.Handle,"BinningY",&nTemp); return (double)nTemp; } return -1.0; }