OpenCV and NDI SDK

I’ve written a slideshow application that reads a file [imread()] (any type supported by OpenCV), then formats it to fit a user window [resize()], and then displays the file [imshow()]. I’d like to make this same image available over NDI, using the NDI SDK. The sample code with the SDK opens a .png file, decodes the file, and then sends it over the network.

I’m having trouble understanding the data formats. I tried taking my Mat object and using the opencv pngImage to convert the data, but the NDI code returns an error that it’s not a valid PNG file. Any help would be appreciated.

BOOL ndiShow(Mat m)
	Mat pngImage(m.rows, m.cols, CV_8UC4, (cv::Vec4b*);
	std::vector<unsigned char> image_data;
	unsigned long xres = 0, yres = 0;

// I'm not sure that the data pointer or size is correct here
	if (decodePNG(image_data, xres, yres, &[0],, true)) {
		return FALSE;

	// We are going to create a frame
	NDIlib_video_frame_v2_t NDI_video_frame;
	NDI_video_frame.xres = pngImage.cols;
	NDI_video_frame.yres = pngImage.rows;
	NDI_video_frame.FourCC = NDIlib_FourCC_type_RGBA;
	NDI_video_frame.p_data =;// &image_data[0];
	NDI_video_frame.line_stride_in_bytes = pngImage.cols * 4;

	// We now submit the frame. Note that this call will be clocked so that we end up submitting at exactly 29.97fps.
	NDIlib_send_send_video_v2(g_pNDI_send, &NDI_video_frame);
return TRUE;

your input Mat is already a decoded image, not a png

remove the pngImage (that isnt one, either !) and the decodePNG call,
and work on your input Mat “as is”

however, since you assume rgba32 data, you should check

m.type() == CV_8UC4

and if it is not so, apply a

cvtConvert(m, m, COLOR_BGR2RGBA);

THANK YOU! That fixed the issue. I really appreciate your help!