OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 3049|回复: 0

如何实现在C#下调用opencv写的dll实现视频的播放?

[复制链接]
发表于 2016-10-17 22:33:21 | 显示全部楼层 |阅读模式
这个是opencv的中的程序:
VideoCapture capture;
const static int maxsize = 800;
//设一个视频总的帧数
extern "C" __declspec(dllexport) int getTotalFrame()
{
return 1000;
}
extern "C" __declspec(dllexport) void openAVI(char *path)
{

capture.open(path);
}
//获取视频的每一帧,算法的主要部分在这里面。该部分返回一个img
extern "C" __declspec(dllexport) uchar*  getFrame(int index)
{
/*char path[]="D:\\20160924_191858.wmv";
capture.open(path);*/
/*设定一个缩放比例,不仅可以有一个比较好的观看效果,还可以减少数据传输的负载
* 缩放的标准为:对于所有的视频,把视频的宽度折算为500
*/
double scale = maxsize*1.0 / capture.get(CV_CAP_PROP_FRAME_WIDTH);
int sw = capture.get(CV_CAP_PROP_FRAME_WIDTH)*scale;
int sh = capture.get(CV_CAP_PROP_FRAME_HEIGHT)*scale;
Size dsize = Size(sw, sh);
//设定视频的大小

uchar img[maxsize*maxsize];
Mat frame;
Mat edges;
//设置视频的帧 ,capture.set(CV_CAP_PROP_POS_FRAMES,position);
capture.set(CV_CAP_PROP_POS_FRAMES, index);
if (capture.read(frame))
{
  cvtColor(frame, frame, CV_BGR2GRAY);
  /*blur(edges, edges, Size(7, 7));
  Canny(edges, edges, 0, 30, 3);*/
  Mat simg = Mat(dsize, CV_8U);
  //resize表示图像缩放
  resize(frame, simg, dsize);
  for (int r = 0; r<simg.rows; r++)
  {
   for (int c = 0; c<simg.cols; c++)
   {
    img[r*simg.cols + c] = simg.at<uchar>(r, c);
   }
  }
}

return img; //返回图片,指针类型(*uchar)

}
/*
* obtain small width
* this width will no longer than maxsize
* defualt value of maxsize is 500
*/
//获取视频帧的宽度
extern "C" __declspec(dllexport) int getSW()
{
if (!capture.isOpened()) return -1;
double scale = maxsize*1.0 / capture.get(CV_CAP_PROP_FRAME_WIDTH);
int sw = capture.get(CV_CAP_PROP_FRAME_WIDTH)*scale;
return sw;
}
/*
* obtain small height
* this height will no longer than maxsize
* defualt value of maxsize is 500
*/
//获取视频帧的高度
extern "C" __declspec(dllexport) int getSH()
{
if (!capture.isOpened()) return -1;
double scale = maxsize*1.0 / capture.get(CV_CAP_PROP_FRAME_WIDTH);
int sh = capture.get(CV_CAP_PROP_FRAME_HEIGHT)*scale;
return sh;
}
extern "C" __declspec(dllexport) int result()
{
return 20;
}
//播放结束,释放内存
extern "C" __declspec(dllexport) void releaseAVI()
{
capture.release();
}
//测试用的简单算法
extern "C" __declspec(dllexport) int Add(int x, int y)
{
return x + y;

}

int main()
{
//reader_opencv2();
//reader_opencv();
char p[] = "";
getFrame(1);
return 0;
}

在c#的winform上面的核心部分主要是下面这段程序:
public void openvideo() //打开视频
        {
            double result = 0;
            try
            {
                lb_result.Text = index + "";
                byte* img = DllHelper.getFrame(index);
                //index表示读取视频帧的位置,每5帧显示一次
                index = index + 5;
                if (index > DllHelper.getTotalFrame()) return;
                int height = DllHelper.getSH();//视频的高度
                int width = DllHelper.getSW();//视频的宽度
                Bitmap bmp = new Bitmap(width, height);//创建一个bitmap空间
                //img不为空,则读取内存中的图像
                if (img != null)
                {
                    for (int r = 0; r < height; r++)
                    {
                        for (int c = 0; c < width; c++)
                        {
                            int gray = img[r * width + c];
                            //C#bitmap像素坐标与opencv是相反的
                            bmp.SetPixel(c, r, Color.FromArgb(gray, gray, gray));
                        }
                    }
                    pictureBox1.Image = bmp;
                    pictureBox1.Show();
                    
                }
            }
            catch (Exception ex)
            {
                //Console.WriteLine(ex.Message);
                //lb_result.Text = ex.Message;
            }
        
        }

还望论坛上有相关经验的可以指导一下。另外这个视频显示出的也是灰度图片,可以帮我看看怎么解决显示彩色图片吗,谢谢!











回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-3-29 00:10 , Processed in 0.014452 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表