MFC+opencv+高斯背景前景提取图像显示问题

最近做项目遇到一个问题,再用混合高斯背景模型提取前景图显示到MFC窗口上的时候,出现了一个问题,图像显示不正常。显示效果如下图:

我是使用Mat类型图像和imshow进行显示的,出现这个状况出乎意料。因为其他都能正常显示。

之后开始在网上查找问题所在,可是经过多方查找,发现网上根本没有此类问题。尴尬。

最后无奈开始各方求助,问答啊,论坛帖子啊都试过却没人解答。。。最后幸好通过指导老师认识了一个研三学长,学长说由于opencv与MFC图像格式不一样所以才会出现这个问题,需要将Mat导成二进制流再转换成MFC的图像格式进行显示。。。。听完后真心觉得麻烦。而且感觉问题似乎不是出在这里。因为其他的图像都能显示,就高斯背景提取有问题。

这之后又经过苦苦搜寻,找到一段网上用MFC显示高斯背景处理结果的代码,经过学习发现他是将Mat型先转为lplimage型经过一次平滑处理再将lplimage型转为Mat就可以顺利显示了。。。我试了下果然可以了。。。

现在我还是想不通原因是啥,或许是个未知的bug吧。。。

希望跟我遇见同样问题的童鞋看到这篇博客能对你有所帮助,也希望知道具体原因的大佬留言交流。

下面是处理该问题的代码:

 1 BackgroundSubtractorMOG2 mog;
 2     Mat frame, back;
 3
 4     if (!cap.isOpened())
 5     {
 6         return;
 7     }
 8
 9     while (cap.read(frame))
10     {
11         if (frame.empty())
12         {
13
14             break;
15         }
16         IplImage src = frame;
17         IplImage *dst = cvCreateImage(cvGetSize(&src), 8, 3);
18         cvSmooth(&src, dst, CV_GAUSSIAN);
19         Mat so = dst;
20         mog(so, back, 0.001);
21
22         threshold(back, back, 100, 255, CV_THRESH_BINARY);
23
24         Mat kernel(3, 3, CV_8U);
25         erode(back, back, kernel);
26
27
28         imshow("gaussian", back);
29
30         int c = waitKey(30);
31         if (c == 27 || c == ‘q‘)
32         {
33             break;
34         }
35
36     }
时间: 2024-08-25 23:48:07

MFC+opencv+高斯背景前景提取图像显示问题的相关文章

混合高斯背景建模

在运动目标检测提取中,背景目标对于目标的识别和跟踪至关重要.而建模正是背景目标提取的一个重要环节. 前景是指在假设背景为静止的情况下,任何有意义的运动物体即为前景. 运动物体检测的问题主要分为两类,摄像机固定和摄像机运动.对于摄像机运动的运动物体检测问题,比较著名的解决方案是光流法,通过求解偏微分方程求的图像序列的光流场,从而预测摄像机的运动状态.对于摄像机固定的情形,当然也可以用光流法,但是由于光流法的复杂性,往往难以实时的计算.而混合高斯背景建模适合于在摄像机固定的情况下从图像序列中分离出背

运动目标检测_混合高斯背景建模

1.混合高斯背景建模理论 混合高斯背景建模是基于像素样本统计信息的背景表示方法,利用像素在较长时间内大量样本值的概率密度等统计信息(如模式数量.每个模式的均值和标准差)表示背景,然后使用统计差分(如3σ原则)进行目标像素判断,可以对复杂动态背景进行建模,计算量较大. 在混合高斯背景模型中,认为像素之间的颜色信息互不相关,对各像素点的处理都是相互独立的.对于视频图像中的每一个像素点,其值在序列图像中的变化可看作是不断产生像素值的随机过程,即用高斯分布来描述每个像素点的颜色呈现规律{单模态(单峰),

高斯背景建模之icvMatchTest函数篇

//对每个象素点进行匹配 static int icvMatchTest( double* src_pixel, int nChannels, int* match, const CvGaussBGPoint* g_point, const CvGaussBGStatModelParams *bg_model_params ) { int k; int matchPosition=-1; //这个匹配的位置只能是0,1,2(在假设3个高斯的前提下) for ( k = 0; k < bg_mod

OpenCV高斯差分技术实现图像边缘检测

纯粹阅读,请移步OpenCV高斯差分技术实现图像边缘检测 效果图 源码 KqwOpenCVFeaturesDemo 边缘是图像中像素亮度变化明显的点. 高斯差分算法步骤 将图像转为灰度图像 // 原图置灰 Imgproc.cvtColor(src, grayMat, Imgproc.COLOR_BGR2GRAY); 用两个不同的模糊半径对灰度图像执行高斯模糊(取得两幅高斯模糊图像) // 以两个不同的模糊半径对图像做模糊处理 Imgproc.GaussianBlur(grayMat, blur1

Opencv 各种特征点提取和匹配

opencv 特征点的提取和匹配 1. 当中的数据结构 KeyPoint这数据结构中有如下数据结构: class KeyPoint { Point2f pt; //坐标 float size; //特征点邻域直径 float angle; //特征点的方向,值为[零,三百六十),负值表示不使用 float response; int octave; //特征点所在的图像金字塔的组 int class_id; //用于聚类的id angle:角度,表示关键点的方向,SIFT算法通过对关键点周围邻域

MFC&amp;Opencv 在Picture控件里显示和处理图像

在VS2005和2008里,我们可以用一个 Solution 来组合几个 Project (每个 Project 基本上只包含一个 Program),当我们要构建一个多Program的应用时(例如一个客户端程序加一个服务器应用程序),利用 Solution 可以将这些 Projects 组合起来.并且共享文件和函数库.通常需要为Solution创建一个主路径,其中包含了有Projects的路径.不过在这篇文章里,我们只构建一个简单的Project,所以在创建MFC的New Project对话框里

opencv::证件照背景替换

证件照背景替换 K-Means 背景融合 – 高斯模糊 遮罩层生成 #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; Mat mat_to_samples(Mat &image); int main(int argc, char** argv) { Mat src = imread("D:/images/toux.jpg")

[OpenCV] 3、直线提取 houghlines

>_<" 发现一个好的链接,是一个讲openCV的网站:http://www.opencv.org.cn/opencvdoc/2.3.2/html/index.html >_<" 这次主要是houghlines变换来提取直线~ 1 #include "opencv2/highgui/highgui.hpp" 2 #include "opencv2/imgproc/imgproc.hpp" 3 #include <io

OpenCV中特征点提取和匹配的通用方法

OpenCV在新版本中把很多C语言的代码都重新整理成了C++代码,让我们在使用的时候更加方便灵活.其中对于特征点的提取和匹配,充分体现了C++的强大.下面直接用例子来说明.假设我们有两幅图:1.bmp和2.bmp,要从中提取体征点并匹配,代码如下: // Load image from file IplImage *pLeftImage = cvLoadImage("1.bmp", CV_LOAD_IMAGE_GRAYSCALE);IplImage *pRightImage = cvL