vlc opencv

Finally the solution was to set a Linker Flag to /OPT:NOREF which is not optimizing your references. You could find this in the Visual Studio Settings by:
Configuration Properties->Linker->Optimization->References





#include "opencv2\highgui\highgui.hpp"
#include "opencv2\imgproc\imgproc.hpp"
#include <iostream>
#include <windows.h>
#include "vlc\libvlc.h"
#include "vlc\vlc.h"

#define WIDTH 800
#define HEIGHT 600

using namespace cv;

struct ctx
{
   Mat* image;
   HANDLE mutex;
   uchar *pixels;
};


void *lock( void *data, void**p_pixels )
{
   struct ctx *ctx = (struct ctx*)data;
   WaitForSingleObject( ctx->mutex, INFINITE );
   *p_pixels = ctx->pixels;
   return NULL;
}

void display( void *data, void *id )
{
   (void) data;
   assert( id == NULL );
}

void unlock( void *data, void *id, void *const *p_pixels )
{
   struct ctx *ctx = (struct ctx*)data;
   ReleaseMutex( ctx->mutex );
}

int main()
{
   libvlc_instance_t  *vlcInstance;
   libvlc_media_player_t *mp;
   libvlc_media_t   *media;
   
   const char *const vlc_args[] = {
  "--no-audio", /* skip any audio track */
        "--no-xlib", /* tell VLC to not use Xlib
      "-I",
       "dummy", 
      "--ignore-config", 
      "--extraintf=logger", 
      "--verbose=2",  */
   };

   int vlc_argc = sizeof(vlc_args)/sizeof(vlc_args[0]);

   //libvlc_instance_t* libvlc_new ( int argc, const char *const *argv )  
   //用於初始化一個libvlc的實例,argc表示參數的個數,argv表示參數,返回創建的實例若當發生錯誤時返回NULL
   vlcInstance = libvlc_new( vlc_argc, vlc_args );
   if( vlcInstance == NULL ){
    std::cout<<"Create Media Stream Error"<<std::endl;
    return 0;
   }

   //LIBVLC_API libvlc_media_t* libvlc_media_new_location( libvlc_instance_t *p_instance, const char *psz_mrl )  
   //使用一個給定的媒體資源路徑來建立一個libvlc_media對象,參數psz_mrl為要讀取的MRL(Media Resource Location),此函數返回新建的對像或NULL.
   const char *psz_mrl = "rtsp://192.168.1.150/media/video1";
   media = libvlc_media_new_location( vlcInstance, psz_mrl );
   if( media == NULL ){
    std::cout<<"Media Stream is Null"<<std::endl;
    return 0;
   }
   
   //LIBVLC_API libvlc_media_player_t* libvlc_media_player_new_from_media( libvlc_media_t *p_md )  
   //根據給定的媒體對象創建一個播放器對象
   mp = libvlc_media_player_new_from_media( media );

   // LIBVLC_API void libvlc_media_release( libvlc_media_t *p_md )  
   //減少一個libvlc_media_t的引用計數,如果減少到0時,此函數將釋放此對象(銷毀).它將發送一個libvlc_MediaFreed事件到所有的監聽者那裡。如果一個libvlc_media_t被釋放了,它就再也不能使用了。
   libvlc_media_release(media);


   struct ctx* context = (struct ctx*)malloc( sizeof(*context) );
   context->mutex      = CreateMutex( NULL, false, NULL );
   context->image      = new Mat( HEIGHT, WIDTH, CV_8UC3 );
   context->pixels     = (unsigned char *)context->image->data;   

   //設定Callback Function複製影像資訊,可藉由libvlc_video_set_format和libvlc_video_set_format_callbacks設定解碼資訊
   libvlc_video_set_callbacks( mp, lock, unlock, display, context );

   //設定影像解碼資訊
   const char *chroma = "RV24";
   unsigned width     = WIDTH;
   unsigned height    = HEIGHT;
   unsigned pitch     = WIDTH*24/8;
   libvlc_video_set_format( mp, chroma, width, height, pitch); 


   // LIBVLC_API int libvlc_media_player_play( libvlc_media_player_t *p_mi )  
   //開始播放串流影片
   libvlc_media_player_play(mp);

   Mat img;
   while( true ){    
  WaitForSingleObject( context->mutex, INFINITE );
  img = context->image->clone();
  ReleaseMutex( context->mutex );

  cv::imshow("test",img);
  std::cout<<"Image "<<img.cols<<std::endl;
  // cv::imwrite("cam.jpg", img);
      cv::waitKey( 40); 
   }

   libvlc_media_player_stop( mp );
   libvlc_media_player_release( mp );
   libvlc_release( vlcInstance );

   return 0;
}