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