1 | initial version |
You can use shared memory (Interprocess communication) to do this. It should be fast enough for 60 fps communication.
See this minimal-working-example that uses OpenCV and Windows. You might need to make changes for a different shared memory implementation, but the memory copy operations should remain the same.
2 | No.2 Revision |
You can use shared memory (Interprocess communication) to do this. It should be fast enough for 60 fps communication.
See this minimal-working-example that uses OpenCV and Windows. You might need to make changes for a different shared memory implementation, but the memory copy operations should remain the same.
edited by @sturkmen to take the attention
@iamsurya thanks for the code you provided.
(maybe useful i attached my test code below)
call the program with video file path param to start server.
call the program without param to start reciever
( you need to change )
int HEIGHT = 720;
int WIDTH = 1280;
according to your video
#include <windows.h>
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;
using namespace std;
#define MAX_LOADSTRING 100
void server(String video_path)
{
cv::Mat currentFrame, resized;
cv::VideoCapture video;
int key;
video.open(video_path);
namedWindow("Sender");
int HEIGHT = 720;
int WIDTH = 1280;
int CHANNELS = 3;
/* Create Shared Memory */
int shmem_size = CHANNELS * WIDTH * HEIGHT; /* Size of image buffer is Channels * Width * Height bytes */
HANDLE shmem = INVALID_HANDLE_VALUE;
HANDLE mutex = INVALID_HANDLE_VALUE;
mutex = ::CreateMutex(NULL, FALSE, "camera_mutex");
shmem = ::CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
shmem_size,
"opencv_camera_buffer"
);
unsigned char *buf = (unsigned char*)::MapViewOfFile(shmem, FILE_MAP_ALL_ACCESS, 0, 0, shmem_size);
/* Run 700 frames */
for (unsigned int c = 0; c < 700; c++) {
/* Load frame */
video.read(currentFrame);
imshow("Sender", currentFrame);
/* Copy to Shared memory */
WaitForSingleObject(mutex, INFINITE);
memcpy(buf, currentFrame.ptr(), shmem_size);
::ReleaseMutex(mutex);
key = waitKey(1000 / 25);
if (key > 31 && key < 127)
break;
}
::UnmapViewOfFile(buf);
::CloseHandle(shmem);
::ReleaseMutex(mutex);
exit(0);
}
void receiver()
{
cv::Mat resized;
namedWindow("Receiver");
int HEIGHT = 720;
int WIDTH = 1280;
int CHANNELS = 3;
int key;
int shmem_size = CHANNELS * HEIGHT * WIDTH; /* Size of image buffer is Channels * Width * Height */
HANDLE shmem = INVALID_HANDLE_VALUE;
HANDLE mutex = INVALID_HANDLE_VALUE;
mutex = ::CreateMutex(NULL, FALSE, "camera_mutex");
shmem = ::CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
shmem_size,
"opencv_camera_buffer"
);
unsigned char *buf = (unsigned char*)::MapViewOfFile(shmem, FILE_MAP_ALL_ACCESS, 0, 0, shmem_size);
for (unsigned int c = 0; c < 700; c++) {
WaitForSingleObject(mutex, INFINITE);
resized = cv::Mat(Size(WIDTH, HEIGHT), 16, buf, CHANNELS * WIDTH);
imshow("Receiver", resized);
::ReleaseMutex(mutex);
key = waitKey(1000 / 25);
if (key > 31 && key < 127)
break;
}
::UnmapViewOfFile(buf);
::CloseHandle(shmem);
::ReleaseMutex(mutex);
exit(0);
}
int main(int argc, char* argv[])
{
if( argc < 2 )
receiver();
else
server(argv[1]);
}
3 | No.3 Revision |
You can use shared memory (Interprocess communication) to do this. It should be fast enough for 60 fps communication.
See this minimal-working-example that uses OpenCV and Windows. You might need to make changes for a different shared memory implementation, but the memory copy operations should remain the same.
edited by @sturkmen to take the attentionThe code is provided under MIT license please cite appropriately.
@iamsurya thanks for the code you provided.edit: Removed attempt to hijack answer and share copyright code.
(maybe useful i attached my test code below)
call the program with video file path param to start server.
call the program without param to start reciever
( you need to change )
int HEIGHT = 720;
int WIDTH = 1280;
according to your video
#include <windows.h>
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;
using namespace std;
#define MAX_LOADSTRING 100
void server(String video_path)
{
cv::Mat currentFrame, resized;
cv::VideoCapture video;
int key;
video.open(video_path);
namedWindow("Sender");
int HEIGHT = 720;
int WIDTH = 1280;
int CHANNELS = 3;
/* Create Shared Memory */
int shmem_size = CHANNELS * WIDTH * HEIGHT; /* Size of image buffer is Channels * Width * Height bytes */
HANDLE shmem = INVALID_HANDLE_VALUE;
HANDLE mutex = INVALID_HANDLE_VALUE;
mutex = ::CreateMutex(NULL, FALSE, "camera_mutex");
shmem = ::CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
shmem_size,
"opencv_camera_buffer"
);
unsigned char *buf = (unsigned char*)::MapViewOfFile(shmem, FILE_MAP_ALL_ACCESS, 0, 0, shmem_size);
/* Run 700 frames */
for (unsigned int c = 0; c < 700; c++) {
/* Load frame */
video.read(currentFrame);
imshow("Sender", currentFrame);
/* Copy to Shared memory */
WaitForSingleObject(mutex, INFINITE);
memcpy(buf, currentFrame.ptr(), shmem_size);
::ReleaseMutex(mutex);
key = waitKey(1000 / 25);
if (key > 31 && key < 127)
break;
}
::UnmapViewOfFile(buf);
::CloseHandle(shmem);
::ReleaseMutex(mutex);
exit(0);
}
void receiver()
{
cv::Mat resized;
namedWindow("Receiver");
int HEIGHT = 720;
int WIDTH = 1280;
int CHANNELS = 3;
int key;
int shmem_size = CHANNELS * HEIGHT * WIDTH; /* Size of image buffer is Channels * Width * Height */
HANDLE shmem = INVALID_HANDLE_VALUE;
HANDLE mutex = INVALID_HANDLE_VALUE;
mutex = ::CreateMutex(NULL, FALSE, "camera_mutex");
shmem = ::CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
shmem_size,
"opencv_camera_buffer"
);
unsigned char *buf = (unsigned char*)::MapViewOfFile(shmem, FILE_MAP_ALL_ACCESS, 0, 0, shmem_size);
for (unsigned int c = 0; c < 700; c++) {
WaitForSingleObject(mutex, INFINITE);
resized = cv::Mat(Size(WIDTH, HEIGHT), 16, buf, CHANNELS * WIDTH);
imshow("Receiver", resized);
::ReleaseMutex(mutex);
key = waitKey(1000 / 25);
if (key > 31 && key < 127)
break;
}
::UnmapViewOfFile(buf);
::CloseHandle(shmem);
::ReleaseMutex(mutex);
exit(0);
}
int main(int argc, char* argv[])
{
if( argc < 2 )
receiver();
else
server(argv[1]);
}
4 | No.4 Revision |
You can use shared memory (Interprocess communication) to do this. It should be fast enough for 60 fps communication.
See this minimal-working-example that uses OpenCV and Windows. Windows shared under MIT license. You might need to make changes for a different shared memory implementation, but the memory copy operations should remain the same.
The code is provided under MIT license please cite appropriately.
edit: Removed attempt to hijack answer and share copyright code.