---------------------------------------------------------------------- ---------------------------------------------------------------------- Funktion: --------- - It always zooms to the image center when offsets are zero - if imageSize = 0 then the image is not zoomed - if imageSize = max value, then the image is fully zoomed in - a zoom step is >>> Width + 32 px / Height + 24 px ---------------------------------------------------------------------- ---------------------------------------------------------------------- void CCamera::SanitizeZoomParams(int imageSize, int frameSizeX, int frameSizeY, int &imageWidth, int &imageHeight, int &zoomOffsetX, int &zoomOffsetY) { // for OV2640, This works only if the aspect ratio of 4:3 is preserved in the window size. // use only values divisible by 8 without remainder imageWidth = CCstatus.ImageWidth + (imageSize * 4 * 8); imageHeight = CCstatus.ImageHeight + (imageSize * 3 * 8); int _maxX = frameSizeX - imageWidth; int _maxY = frameSizeY - imageHeight; if ((abs(zoomOffsetX) * 2) > _maxX) { if (zoomOffsetX > 0) { zoomOffsetX = _maxX; } else { zoomOffsetX = 0; } } else { if (zoomOffsetX > 0) { zoomOffsetX = ((_maxX / 2) + zoomOffsetX); } else { zoomOffsetX = ((_maxX / 2) + zoomOffsetX); } } if ((abs(zoomOffsetY) * 2) > _maxY) { if (zoomOffsetY > 0) { zoomOffsetY = _maxY; } else { zoomOffsetY = 0; } } else { if (zoomOffsetY > 0) { zoomOffsetY = ((_maxY / 2) + zoomOffsetY); } else { zoomOffsetY = ((_maxY / 2) + zoomOffsetY); } } } void CCamera::SetZoomSize(bool zoomEnabled, int zoomOffsetX, int zoomOffsetY, int imageSize) { sensor_t *s = esp_camera_sensor_get(); if (s != NULL) { if (zoomEnabled) { int _imageSize_temp = 0; int _imageWidth = CCstatus.ImageWidth; int _imageHeight = CCstatus.ImageHeight; int _offsetx = zoomOffsetX; int _offsety = zoomOffsetY; int frameSizeX; int frameSizeY; switch (s->id.PID) { case OV5640_PID: frameSizeX = 2592; frameSizeY = 1944; // max imageSize = ((frameSizeX - CCstatus.ImageWidth) / 8 / 4) - 1 // 59 = ((2560 - 640) / 8 / 4) - 1 if (imageSize < 59) { _imageSize_temp = (59 - imageSize); } SanitizeZoomParams(_imageSize_temp, frameSizeX, frameSizeY, _imageWidth, _imageHeight, _offsetx, _offsety); SetCamWindow(s, frameSizeX, frameSizeY, _offsetx, _offsety, _imageWidth, _imageHeight, CCstatus.ImageWidth, CCstatus.ImageHeight); break; case OV3660_PID: frameSizeX = 2048; frameSizeY = 1536; // max imageSize = ((frameSizeX - CCstatus.ImageWidth) / 8 / 4) -1 // 43 = ((2048 - 640) / 8 / 4) - 1 if (imageSize < 43) { _imageSize_temp = (43 - imageSize); } SanitizeZoomParams(_imageSize_temp, frameSizeX, frameSizeY, _imageWidth, _imageHeight, _offsetx, _offsety); SetCamWindow(s, frameSizeX, frameSizeY, _offsetx, _offsety, _imageWidth, _imageHeight, CCstatus.ImageWidth, CCstatus.ImageHeight); break; case OV2640_PID: frameSizeX = 1600; frameSizeY = 1200; // max imageSize = ((frameSizeX - CCstatus.ImageWidth) / 8 / 4) -1 // 29 = ((1600 - 640) / 8 / 4) - 1 if (imageSize < 29) { _imageSize_temp = (29 - imageSize); } SanitizeZoomParams(_imageSize_temp, frameSizeX, frameSizeY, _imageWidth, _imageHeight, _offsetx, _offsety); SetCamWindow(s, frameSizeX, frameSizeY, _offsetx, _offsety, _imageWidth, _imageHeight, CCstatus.ImageWidth, CCstatus.ImageHeight); break; default: // do nothing break; } } else { s->set_framesize(s, CCstatus.ImageFrameSize); } } } void CCamera::SetQualityZoomSize(int qual, framesize_t resol, bool zoomEnabled, int zoomOffsetX, int zoomOffsetY, int imageSize) { qual = min(63, max(6, qual)); // Limit quality from 6..63 (values lower than 8 tent to be unstable) SetImageWidthHeightFromResolution(resol); sensor_t *s = esp_camera_sensor_get(); if (s != NULL) { s->set_quality(s, qual); SetZoomSize(zoomEnabled, zoomOffsetX, zoomOffsetY, imageSize); } else { LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "SetQualityZoomSize, Failed to get Cam control structure"); } } void CCamera::SetCamSharpness(bool _autoSharpnessEnabled, int _sharpnessLevel) { sensor_t *s = esp_camera_sensor_get(); if (s != NULL) { _sharpnessLevel = min(2, max(-2, _sharpnessLevel)); if (s->id.PID == OV2640_PID) { // The OV2640 does not officially support sharpness, so the detour is made with the ov2640_sharpness.cpp. if (_autoSharpnessEnabled) { ov2640_enable_auto_sharpness(s); } else { ov2640_set_sharpness(s, _sharpnessLevel); } } else { // for CAMERA_OV5640 and CAMERA_OV3660 if (_autoSharpnessEnabled) { // autoSharpness is not supported, default to zero s->set_sharpness(s, 0); } else { s->set_sharpness(s, _sharpnessLevel); } } } else { LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "SetCamSharpness, Failed to get Cam control structure"); } } void CCamera::SetCamWindow(sensor_t *s, int frameSizeX, int frameSizeY, int xOffset, int yOffset, int xTotal, int yTotal, int xOutput, int yOutput) { if (s->id.PID == OV2640_PID) { s->set_res_raw(s, 0, 0, 0, 0, xOffset, yOffset, xTotal, yTotal, xOutput, yOutput, false, false); } else { // for CAMERA_OV5640 and CAMERA_OV3660 s->set_res_raw(s, xOffset, yOffset, xTotal, yTotal, 0, 0, frameSizeX, frameSizeY, xOutput, yOutput, false, false); } }