SlideIO 2.0.0
Open-source library for reading of medical images
Loading...
Searching...
No Matches
cziscene.hpp
1// This file is part of slideio project.
2// It is subject to the license terms in the LICENSE file found in the top-level directory
3// of this distribution and at http://slideio.com/license.html.
4#ifndef OPENCV_slideio_cziscene_HPP
5#define OPENCV_slideio_cziscene_HPP
6#include "slideio/drivers/czi/czi_api_def.hpp"
7#include "slideio/core/cvscene.hpp"
8#include "slideio/core/tools/tilecomposer.hpp"
9#include "slideio/drivers/czi/czisubblock.hpp"
10#include "slideio/drivers/czi/czistructs.hpp"
11#include <map>
12
13#if defined(_MSC_VER)
14#pragma warning( push )
15#pragma warning(disable: 4251)
16#endif
17
18namespace slideio
19{
20 class CZISlide;
21 class SLIDEIO_CZI_EXPORTS CZIScene : public CVScene, public Tiler
22 {
23 public:
24 struct SceneParams
25 {
26 int illuminationIndex;
27 int bAcquisitionIndex;
28 int rotationIndex;
29 int sceneIndex;
30 int hPhaseIndex;
31 int viewIndex;
32 };
33 private:
34 struct Tile
35 {
36 Tile() { rect = { 0,0,0,0 }; }
37 std::vector<int> blockIndices;
38 cv::Rect rect;
39 };
40 typedef std::vector<Tile> Tiles;
41 struct ZoomLevel
42 {
43 double zoom{};
44 CZISubBlocks blocks;
45 Tiles tiles;
46 };
47 struct ComponentInfo
48 {
49 std::string name;
50 DataType dataType;
51 };
52 struct SceneChannelInfo
53 {
54 std::string name;
55 int32_t pixelType;
56 int32_t pixelSize;
57 int32_t firstComponent;
58 int32_t numComponents;
59 DataType componentType;
60 };
61 struct TilerData
62 {
63 int zoomLevelIndex;
64 int zSliceIndex;
65 int tFrameIndex;
66 double relativeZoom;
67 };
68 public:
69 CZIScene();
70 std::string getFilePath() const override;
71 cv::Rect getRect() const override;
72 int getNumChannels() const override;
73 int getNumZSlices() const override;
74 int getNumTFrames() const override;
75 double getZSliceResolution() const override;
76 double getTFrameResolution() const override;
77 slideio::DataType getChannelDataType(int channel) const override;
78 std::string getChannelName(int channel) const override;
79 Resolution getResolution() const override;
80 double getMagnification() const override;
81 std::string getName() const override;
82 void init(uint64_t sceneId, SceneParams& sceneParams, const std::string& filePath, const CZISubBlocks& blocks, CZISlide* slide);
83 // interface Tiler implementaton
84 int getTileCount(void* userData) override;
85 bool getTileRect(int tileIndex, cv::Rect& tileRect, void* userData) override;
86 bool readTile(int tileIndex, const std::vector<int>& componentIndices, cv::OutputArray tileRaster,
87 void* userData) override;
88 void initializeBlock(const cv::Size& blockSize, const std::vector<int>& channelIndices, cv::OutputArray output) override;
89 Compression getCompression() const override{
90 return m_compression;
91 }
92 void addAuxImage(const std::string& name, std::shared_ptr<CVScene> image);
93 std::shared_ptr<CVScene> getAuxImage(const std::string& sceneName) const override;
94 bool isMosaic() const { return m_bMosaic; }
95 void readResampledBlockChannelsEx(const cv::Rect& blockRect, const cv::Size& blockSize,
96 const std::vector<int>& componentIndices, int zSliceIndex, int tFrameIndex, cv::OutputArray output) override;
97 private:
98 void setMosaic(bool mosaic) { m_bMosaic = mosaic; }
99 void setupComponents(const std::map<int, int>& channelPixelType);
100 void generateSceneName();
101 void computeSceneRect();
102 void computeSceneTiles();
103 void compute4DParameters();
104 void updateTileRects(ZoomLevel& value);
105 void updateTileRects();
106 const ZoomLevel& getBaseZoomLevel() const;
107 void initZoomLevelInfo();
108 int findBlockIndex(const Tile& tile, const CZISubBlocks& blocks, int channelIndex, int zSliceIndex, int tFrameIndex) const ;
109 const Tile& getTile(const TilerData* tilerData, int tileIndex) const;
110 const CZISubBlocks& getBlocks(const TilerData* tilerData) const;
111 bool blockHasData(const CZISubBlock& block, const std::vector<int>& componentIndices, const TilerData* tilerData);
112 std::vector<uint8_t> decodeData(const CZISubBlock& block, const std::vector<unsigned char>& encodedData);
113 void unpackChannels(const CZISubBlock& block, const std::vector<int>& orgComponentIndices, const std::vector<unsigned char>& blockData, const TilerData* tilerData, std::vector<cv::Mat>& componentRasters);
114 void computeSceneMetadata();
115 public:
116 // static members
117 static uint64_t sceneIdFromDims(int s, int i, int v, int h, int r, int b);
118 static uint64_t sceneIdFromDims(const std::vector<Dimension>& dims);
119 static void sceneIdsFromDims(const std::vector<Dimension>& dims, std::vector<uint64_t>& ids);
120 static uint64_t sceneIdFromDims(const SceneParams& params);
121 static void dimsFromSceneId(uint64_t sceneId, int& s, int& i, int& v, int& h, int& r, int& b);
122 static void dimsFromSceneId(uint64_t sceneId, SceneParams& params);
123 static void channelComponentInfo(CZIDataType channelType, DataType& componentType, int& numComponents, int& pixelSize);
124 private:
125 void combineBlockInTiles(ZoomLevel& zoomLevel);
126 // data members
127 private:
128 std::vector<ZoomLevel> m_zoomLevels;
129 std::vector<ComponentInfo> m_componentInfos;
130 std::vector<SceneChannelInfo> m_channelInfos;
131 std::string m_filePath;
132 cv::Rect m_sceneRect;
133 std::map<int, std::pair<int, int>> m_componentToChannelIndex;
134 CZISlide* m_slide;
135 std::string m_name;
136 uint64_t m_id{};
137 SceneParams m_sceneParams{};
138 int m_numZSlices;
139 int m_numTFrames;
140 int m_firstSliceIndex = 0;
141 int m_firstTFrameIndex = 0;
142 Compression m_compression;
143 std::map<std::string, std::shared_ptr<CVScene>> m_auxImages;
144 bool m_bMosaic;
145 };
146}
147
148
149#if defined(_MSC_VER)
150#pragma warning( pop )
151#endif
152
153#endif
Definition: exceptions.hpp:15
Compression
raster data compression enum
Definition: slideio_enums.hpp:12