Member 12811031 Ответов: 2

Как отобразить сохраненное изображение в папке в течение действительно короткого периода времени (менее 100 наносекунд)


Я новичок в программировании в целом, но благодаря вам, ребята, смог быстро освоиться.
У меня есть пара фотографий,и я хотел бы показать каждую фотографию как можно короче. До сих пор я использовал Opencv, и он отлично работает. Я смог выяснить, как получить нужные мне фотографии и отобразить их с помощью cv::imshow и cv::waitKey (), но waitKey, как мы все знаем, неточен в своем времени, а также не позволяет мне показывать фотографии с таким высоким временным разрешением, как мне хотелось бы.
До сих пор я пытался использовать альтернативы, такие как цикл событий и ограничение времени выполнения потока imshow, но ничего не сработало к моему удовлетворению.
Во-первых, я хотел бы выяснить, сколько времени требуется imshow для отображения изображения на экране (я предполагаю, что это во многом связано со скоростью процессора).

Наконец (что является моим фактическим вопросом), есть ли способ сделать это (даже если гипотетический и непрактичный), и если да, то как мне это сделать (ваши ответы очень ценятся).

Что я уже пробовал:

#include <chrono>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <cstdint>
#include <thread>
#include <opencv2 core="" core.hpp="">
#include <opencv2 highgui="" highgui.hpp="">

static std::condition_variable condvar;
static std::mutex mut;
static bool stop = false;
cv::String folder = "picture location...";
std::vector<cv::string> filenames;


void
loopFunction()
{
	using delta = std::chrono::duration<std::int64_t, std::ratio<1,="" 10000000="">>;
	auto next = std::chrono::steady_clock::now() + delta{ 1 };
	std::unique_lock<std::mutex> lk(mut);
	while (!stop)
	{
		mut.unlock();

		// Display pictures
		for (size_t i = 0; i < 5; ++i)
		{
			if (i > 1) {
				i = 0;
			}

			cv::Mat myImage = cv::imread(filenames[i]);
			cv::imshow("Boiii", myImage);

			// Wait for the next 1/10000000 sec
			mut.lock();
			condvar.wait_until(lk, next, [] {return false; });
			next += delta{ 1 };
		}
	}
}

int main()
{
	cv::glob(folder, filenames);
	using namespace std::chrono_literals;
	std::thread t{ loopFunction };

	std::this_thread::sleep_for(5s);
	{
		std::lock_guard<std::mutex> lk(mut);
		stop = true;
	}
	t.join();
}

Mehdi Gholam

Почему? даже при скорости 60 кадров в секунду это дает 16 мс.

Dave Kreskowiak

Ваше время субъективно. Что вы называете "демонстрацией образа"? Это время, необходимое для перемещения изображения в видеобуфер? Время, необходимое для загрузки изображения и его отображения? Монитор может не реагировать на вносимые изменения до следующего обновления, и вам даже придется ждать ответа жидкого кристалла на мониторе, чтобы он действительно был "показан".

Так что же именно вы рассчитываете? Лучший таймер разрешения, который вы получите в Windows в https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408 (v=против 85). aspx. Даже тогда, поскольку Windows не является операционной системой реального времени, вы не получите точное время с требуемым разрешением и/или точностью.

2 Ответов

Рейтинг:
1

CPallini

Вы не можете этого сделать. Такое временное разрешение недоступно в Windows.


Рейтинг:
1

Bernhard Hiller

С монитором компьютера этого не сделаешь. Для этого вам нужно изобрести собственное оборудование. Но в любом случае, показывать изображение менее одной миллионной секунды кажется очень бесполезным...