Getting ready for new type of camera listing.
This commit is contained in:
parent
522eb86316
commit
f9608aa758
1 changed files with 67 additions and 0 deletions
|
@ -211,4 +211,71 @@ namespace UtilitiesOF {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// A utility for listing the currently connected cameras together with their ID, subset of supported resolutions and a thumbnail
|
||||||
|
static List<System::Tuple<int, List<System::Tuple<int, int>^>^, OpenCVWrappers::RawImage^>^>^ GetCameras()
|
||||||
|
{
|
||||||
|
auto managed_camera_list = gcnew List<System::Tuple<int, List<System::Tuple<int, int>^>^, OpenCVWrappers::RawImage^>^>();
|
||||||
|
|
||||||
|
// Go through camera id's untill no new cameras are found
|
||||||
|
int num_cameras = 0;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
cv::VideoCapture cap(num_cameras);
|
||||||
|
if (cap.isOpened())
|
||||||
|
num_cameras++;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < num_cameras; ++i)
|
||||||
|
{
|
||||||
|
//std::string name = cameras[i].name();
|
||||||
|
//System::String^ name_managed = gcnew System::String(name.c_str());
|
||||||
|
|
||||||
|
auto resolutions = gcnew List<System::Tuple<int, int>^>();
|
||||||
|
|
||||||
|
// A common set of resolutions for webcams
|
||||||
|
std::vector<std::pair<int, int>> common_resolutions;
|
||||||
|
common_resolutions.push_back(std::pair<int, int>(320, 240));
|
||||||
|
common_resolutions.push_back(std::pair<int, int>(640, 480));
|
||||||
|
common_resolutions.push_back(std::pair<int, int>(1280, 960));
|
||||||
|
|
||||||
|
// Grab some sample images and confirm the resolutions
|
||||||
|
cv::VideoCapture cap1(i);
|
||||||
|
|
||||||
|
cv::Mat sample_img;
|
||||||
|
OpenCVWrappers::RawImage^ sample_img_managed = gcnew OpenCVWrappers::RawImage();
|
||||||
|
|
||||||
|
// Go through resolutions if they have not been identified
|
||||||
|
for (auto beg = common_resolutions.begin(); beg != common_resolutions.end(); ++beg)
|
||||||
|
{
|
||||||
|
auto resolution = gcnew System::Tuple<int, int>(beg->first, beg->first);
|
||||||
|
|
||||||
|
cap1.set(CV_CAP_PROP_FRAME_WIDTH, resolution->Item1);
|
||||||
|
cap1.set(CV_CAP_PROP_FRAME_HEIGHT, resolution->Item2);
|
||||||
|
|
||||||
|
// Add only valid resolutions as API sometimes provides wrong ones
|
||||||
|
int set_width = cap1.get(CV_CAP_PROP_FRAME_WIDTH);
|
||||||
|
int set_height = cap1.get(CV_CAP_PROP_FRAME_HEIGHT);
|
||||||
|
|
||||||
|
// Read several frames, as the first one often is over-exposed
|
||||||
|
for (int k = 0; k < 2; ++k)
|
||||||
|
cap1.read(sample_img);
|
||||||
|
|
||||||
|
resolution = gcnew System::Tuple<int, int>(set_width, set_height);
|
||||||
|
if (!resolutions->Contains(resolution))
|
||||||
|
{
|
||||||
|
resolutions->Add(resolution);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sample_img.copyTo(sample_img_managed->Mat);
|
||||||
|
|
||||||
|
cap1.~VideoCapture();
|
||||||
|
|
||||||
|
managed_camera_list->Add(gcnew System::Tuple<int, List<System::Tuple<int, int>^>^, OpenCVWrappers::RawImage^>(i, resolutions, sample_img_managed));
|
||||||
|
}
|
||||||
|
|
||||||
|
return managed_camera_list;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue