diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h
index 8331898c..6ce63912 100644
--- a/include/libcamera/camera_manager.h
+++ b/include/libcamera/camera_manager.h
@@ -7,6 +7,7 @@
 #ifndef __LIBCAMERA_CAMERA_MANAGER_H__
 #define __LIBCAMERA_CAMERA_MANAGER_H__
 
+#include <map>
 #include <memory>
 #include <string>
 #include <vector>
@@ -33,6 +34,7 @@ public:
 
 	const std::vector<std::shared_ptr<Camera>> &cameras() const { return cameras_; }
 	std::shared_ptr<Camera> get(const std::string &name);
+	std::shared_ptr<Camera> get(dev_t devnum);
 
 	void addCamera(std::shared_ptr<Camera> camera);
 	void removeCamera(Camera *camera);
@@ -46,6 +48,7 @@ private:
 	std::unique_ptr<DeviceEnumerator> enumerator_;
 	std::vector<std::shared_ptr<PipelineHandler>> pipes_;
 	std::vector<std::shared_ptr<Camera>> cameras_;
+	std::map<dev_t, std::shared_ptr<Camera>> camerasByDevnum_;
 
 	static const std::string version_;
 	static CameraManager *self_;
diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 7c6f72bb..1354df4c 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -121,6 +121,11 @@ int CameraManager::start()
 		}
 	}
 
+	for (std::shared_ptr<PipelineHandler> pipe : pipes_) {
+		const std::map<dev_t, std::weak_ptr<Camera>> devMap = pipe->camerasByDevnum();
+		camerasByDevnum_.insert(devMap.begin(), devMap.end());
+	}
+
 	/* TODO: register hot-plug callback here */
 
 	return 0;
@@ -180,6 +185,25 @@ std::shared_ptr<Camera> CameraManager::get(const std::string &name)
 	return nullptr;
 }
 
+/**
+ * \brief Get a camera based on devnum
+ * \param[in] devnum Device number of camera to get
+ *
+ * Before calling this function the caller is responsible for ensuring that
+ * the camera manager is running.
+ *
+ * \return Shared pointer to Camera object or nullptr if camera not found
+ */
+std::shared_ptr<Camera> CameraManager::get(dev_t devnum)
+{
+	auto iter = camerasByDevnum_.find(devnum);
+
+	if (iter == camerasByDevnum_.end())
+		return nullptr;
+
+	return iter->second;
+}
+
 /**
  * \brief Add a camera to the camera manager
  * \param[in] camera The camera to be added
