c++-要做一个C++项目 关于自动抠像的

问题描述

要做一个C++项目 关于自动抠像的

VS2010 在新建项目的时候 我该用控制台应用程序呢 还是win32程序创建项目呢? 求解释 我们在学C++的时候一直在用控制台应用程序 可是 要做项目 不应该是有界面 可视度比较强的项目吗 但是 并没有学过win32编程诶。。 这个不需要另外学吗。。

解决方案

这要看你的算法主要不主要了,现在处理方面有一些库,实际上你只需要是控制台应用就行,一些界面可以调用库里

解决方案二:

可以调用库函数来实现

解决方案三:

控制台应用程序
#include "cv.h"
#include "highgui.h"
#include
#include

#pragma comment(lib, "opencv_core2410d.lib")
#pragma comment(lib, "opencv_highgui2410d.lib")
#pragma comment(lib, "opencv_imgproc2410d.lib")
#pragma comment(lib, "opencv_objdetect2410d.lib")
#pragma comment(lib, "opencv_video2410d.lib")

#pragma comment(lib, "libjasperd.lib")
#pragma comment(lib, "IlmImfd.lib")
#pragma comment(lib, "libjpegd.lib")
#pragma comment(lib, "libpngd.lib")
#pragma comment(lib, "libtiffd.lib")
#pragma comment(lib, "zlibd.lib")

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")

#pragma comment( lib, "vfw32.lib" )

#pragma comment( lib, "comctl32.lib" )

static CvMemStorage*storage = 0;
static CvHaarClassifierCascade*cascade = 0;
void detect_and_draw(IplImage* image);
const char*cascade_name = "haarcascade_frontalface_alt.xml";//人脸检测分类器

IplImage image_c = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0;
//用HSV中的Hue分量进行跟踪
CvHistogram *hist = 0;//直方图类
int select_object = 0;
int track_object = 0;
CvPoint origin;
CvRect selection;
CvRect track_window;
CvBox2D track_box;
CvConnectedComp track_comp;
int hdims = 16;//划分直方图bins的个数,越多越精确
float hranges_arr[] = { 0, 180 };//像素值的范围
float
hranges = hranges_arr;//用于初始化CvHistogram类
int vmin = 10, vmax = 256, smin = 30;//用于范围
void on_mouse(int event, int x, int y, int flags, void* param);
CvScalar hsv2rgb(float hue);

int on_off = 0;
int main(int argc, char**argv)
{
CvCapture* capture = 0;
IplImage frame, *frame_copy = 0;
const char*input_name;
char c;
input_name = argc> 1 ? argv[1] : 0;
cascade = (CvHaarClassifierCascade
)cvLoad(cascade_name, 0, 0, 0);
if (!cascade)//如果没有找到分类器,输出以下
{
fprintf(stderr,"ERROR: Could notload classifier cascaden");
return -1;
}
storage = cvCreateMemStorage(0);
capture = cvCaptureFromCAM(!input_name ? 0 : input_name[0] - '0');//读取摄像头
if(!capture)//如果没有摄像头读取视频文件
capture = cvCaptureFromAVI("检测.avi");
cvNamedWindow("result", 1);//创建窗口

cvSetMouseCallback("result", on_mouse, 0);//设置鼠标回调函数

if (capture)
{
    for (;;)
    {
        frame = cvQueryFrame(capture);
        if (!frame)
            break;
        if( !frame_copy)
            frame_copy= cvCreateImage( cvSize(frame->width,frame->height), IPL_DEPTH_8U,frame->nChannels );
        if (on_off)
        {
            if (frame->origin == IPL_ORIGIN_TL)
                cvCopy(frame, frame_copy, 0);
            else cvFlip(frame, frame_copy, 0);
            detect_and_draw(frame_copy);
        }
        else
        {
            if (!image_c)//image为0,表明刚开始还未对image操作过,先建立一些缓冲区
            {
                image_c = cvCreateImage(cvGetSize(frame), 8, 3);
                image_c->origin = frame->origin;
                hsv = cvCreateImage(cvGetSize(frame), 8, 3);
                hue = cvCreateImage(cvGetSize(frame), 8, 1);
                mask = cvCreateImage(cvGetSize(frame), 8, 1);
                //分配掩膜图像空间
                backproject = cvCreateImage(cvGetSize(frame), 8, 1);
                //分配反向投影图空间,大小一样,单通道
                hist = cvCreateHist(1, &hdims, CV_HIST_ARRAY, &hranges, 1);
                //分配直方图空间
            }
            cvCopy(frame, image_c, 0);
            cvCvtColor(image_c, hsv, CV_BGR2HSV);//把图像从RGB表色系转为HSV表色系
            if (track_object)//track_object非零,表示有需要跟踪的物体
            {
                cvInRangeS(hsv, cvScalar(0, smin, MIN(vmin, vmax), 0),
                    cvScalar(180, 256, MAX(vmin, vmax), 0), mask);
                //制作掩膜板,只处理像素值为H:0~180,S:smin~256,V:vmin~vmax之间的部分
                cvSplit(hsv, hue, 0, 0, 0);//分离H分量
                if (track_object < 0)
                    //如果需要跟踪的物体还没有进行属性提取,则进行选取框类的图像属性提取
                {
                    float max_val = 0.f;
                    cvSetImageROI(hue, selection);//设置原选择框为ROI
                    cvSetImageROI(mask, selection);//设置掩膜板选择框为ROI
                    cvCalcHist(&hue, hist, 0, mask);//得到选择框内且满足掩膜板内的直方图
                    cvGetMinMaxHistValue(hist, 0, &max_val, 0, 0);
                    cvConvertScale(hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0);
                    // 对直方图的数值转为0~255
                    cvResetImageROI(hue);//去除ROI
                    cvResetImageROI(mask);//去除ROI
                    track_window = selection;
                    track_object = 1;//置track_object为1,表明属性提取完成
                }
                cvCalcBackProject(&hue, backproject, hist);//计算hue的反向投影图
                cvAnd(backproject, mask, backproject, 0);//得到掩膜内的反向投影
                cvCamShift(backproject, track_window,
                    cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1),
                    &track_comp, &track_box);//使用MeanShift算法对backproject中的内容进行搜索,返回跟踪结果
                track_window = track_comp.rect;//得到跟踪结果的矩形框

                if (image_c->origin)
                    track_box.angle = -track_box.angle;
                cvEllipseBox(image_c, track_box, CV_RGB(255, 0, 0), 3, CV_AA, 0);
                //画出跟踪结果的位置
            }
            if (select_object && selection.width > 0 && selection.height > 0)//如果正处于物体选择,画出选择框
            {
                cvSetImageROI(image_c, selection);
                cvXorS(image_c, cvScalarAll(255), image_c, 0);
                cvResetImageROI(image_c);
            }
            cvShowImage("result", image_c);
        }
        c = cvWaitKey(10);
        if ((char)c == 27)
            break;
        else if ((char)c == 'b')
            on_off = 1 - on_off;

    }
    cvReleaseImage(&frame_copy);
    cvReleaseCapture(&capture);
}
cvDestroyWindow("result");
return 0;

}
void on_mouse(int event, int x, int y, int flags, void* param)
//鼠标回调函数,该函数用鼠标进行跟踪目标的选择
{
if (!image_c)
return;
if (image_c->origin)
y = image_c->height - y;//如果图像原点坐标在左下,则将其改为左上
if (select_object)//select_object为1,表示在用鼠标进行目标选择
//此时对矩形类selection用当前的鼠标位置进行设置
{
selection.x = MIN(x, origin.x);
selection.y = MIN(y, origin.y);
selection.width = selection.x + CV_IABS(x - origin.x);
selection.height = selection.y + CV_IABS(y - origin.y);

    selection.x = MAX(selection.x, 0);
    selection.y = MAX(selection.y, 0);
    selection.width = MIN(selection.width, image_c->width);
    selection.height = MIN(selection.height, image_c->height);
    selection.width -= selection.x;
    selection.height -= selection.y;
}
switch (event)
{
case CV_EVENT_LBUTTONDOWN:
    //鼠标按下,开始点击选择跟踪物体
    origin = cvPoint(x, y);
    selection = cvRect(x, y, 0, 0);
    select_object = 1;
    break;
case CV_EVENT_LBUTTONUP:
    //鼠标松开,完成选择跟踪物体
    select_object = 0;
    if (selection.width > 0 && selection.height > 0)
        //如果选择物体有效,则打开跟踪功能
        track_object = -1;
    break;
}

}
CvScalar hsv2rgb(float hue)//用于将Hue量转换成RGB量
{
int rgb[3], p, sector;
static const int sector_data[][3] =
{ { 0, 2, 1 }, { 1, 2, 0 }, { 1, 0, 2 }, { 2, 0, 1 }, { 2, 1, 0 }, { 0, 1, 2 } };
hue *= 0.033333333333333333333333333333333f;
sector = cvFloor(hue);
p = cvRound(255 * (hue - sector));
p ^= sector & 1 ? 255 : 0;

rgb[sector_data[sector][0]] = 255;
rgb[sector_data[sector][1]] = 0;
rgb[sector_data[sector][2]] = p;

return cvScalar(rgb[2], rgb[1], rgb[0], 0);

}
void detect_and_draw(IplImage* img)
{
static CvScalar colors[] =
{
{ { 0, 0, 255 } },
{ { 0, 128, 255 } },
{ { 0, 255, 255 } },
{ { 0, 255, 0 } },
{ { 255, 128, 0 } },
{ { 255, 255, 0 } },
{ { 255, 0, 0 } },
{ { 255, 0, 255 } }
};
double scale = 1.3;
IplImage* gray = cvCreateImage(cvSize(img->width, img->height), 8, 1);
IplImage* small_img = cvCreateImage(cvSize(cvRound(img->width / scale), cvRound(img->height / scale)), 8, 1);
int i;
cvCvtColor(img, gray, CV_BGR2GRAY);
cvResize(gray, small_img, CV_INTER_LINEAR);
cvEqualizeHist(small_img, small_img);
cvClearMemStorage(storage);
if (cascade)
{
double t = (double)cvGetTickCount();
CvSeq* faces = cvHaarDetectObjects(small_img, cascade, storage, 1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/, cvSize(30, 30));//检测人脸返回矩形人脸
t = (double)cvGetTickCount() - t;
printf("detection time = %gmsn", t / ((double)cvGetTickFrequency()*1000.));
for (i = 0; i < (faces ? faces->total : 0); i++)//找到矩形中心,把矩形转化为圆形
{
CvRect*r = (CvRect*)cvGetSeqElem(faces, i);
CvPoint center;
int radius;
center.x = cvRound((r->x + r->width*0.5)*scale);
center.y = cvRound((r->y + r->height*0.5)*scale);
radius = cvRound((r->width + r->height)*0.25*scale);
cvCircle(img, center, radius, colors[i % 8], 3, 8, 0);
}
}
cvShowImage("result", img);
cvReleaseImage(&gray);
cvReleaseImage(&small_img);
}

解决方案四:

控制台程序还是win32程序,是你的程序的交互方式。无论哪种交互方式,肯定都能实现抠像的算法。
交互方式和抠像本身没有必然的联系。到底选哪种,当然看你的设计需要。
不过推荐使用OpenCV做控制台程序。这样可以专心实现抠像算法本身,而不必再去学习可视化程序设计。

解决方案五:

可以调用库函数来实现

时间: 2024-08-04 01:26:04

c++-要做一个C++项目 关于自动抠像的的相关文章

北大青鸟s1结业要用窗体做一个小项目,能不能推荐几个

问题描述 北大青鸟s1结业要用窗体做一个小项目,能不能推荐几个?不要太难的 解决方案 解决方案二:北大菜鸟.......孩子退学吧学费很贵的起码两万块...解决方案三:北大青鸟还结业!!!!解决方案四:不要黑我的母校好不好教育改变生活知识改变命运飞吧青鸟~解决方案五:退学吧.浪费爸爸妈妈的辛苦钱.解决方案六: 解决方案七: 解决方案八:在这里问还不如自己去搜个源码也省得被人嘲PS:某鸟结业连个窗体小项目都做不出来????解决方案九:可以做一个图书管理系统.这个很容易吧.解决方案十:就那小项目都做

我想用C#做一个WINDOWS窗体程序自动填写一个网站的密码和用户名并登陆进网站!

问题描述 我想做一个WINDOWS窗体程序自动填写一个网站网站密码和用户名并登陆进网站?就是用WINDOWS程序操控网页上面的文本框和按钮!请要用到些什么技术?有没有一些实例,请大侠们介绍介绍? 解决方案 解决方案二:user32.dll里面有函数可以获取窗体.找到浏览器之后再操作吧.解决方案三:使用HttpWebRequestHttpWebResponse类或者WebClient需要借助HttpLook等工具解决方案四:建议你使用Watir,网页测试用的,可以控制网页中的一切解决方案五:或者w

如何做一个类似MyEclipse能自动提示的东西

问题描述 比如医院的人写文档时写一个字就会自动提示一些相关的词,这些词也是自己整理出来的专业词汇,就是自己做一个完整的,并不是页面上一点点提示也不是什么历史记录,就比如myecl你写一个p会提示publicprivat等,类似字典,你写一个a就会提示a开头的相关字或词语.是做整个出来,包括数据的建立和代码的编写.希望给思路和意见. 解决方案 解决方案二:你看一看看<编译原理>这本书解决方案三:设计思路:1.要设计一张词库表,这张词库里面记录了大量的内容:2.在输入框或者输入域进行监听,当输入框

开发工具-c++期末要做一个项目,有诸多不懂的地方,请大家帮帮忙

问题描述 c++期末要做一个项目,有诸多不懂的地方,请大家帮帮忙 上学期学了c语言,这学期学c++,c++讲到类的继承这个地方了,然后老师今天给我们说叫要做一个大项目,自己分组.我主要有两方面的疑问 一是开发工具的选择和下载,平时用的都是codeblocks,所以电脑上只装了codeblocks;但听老师说大项目涉及到MFC编程,就要用微软提供的vc++6.0或者vs 我不知道它们的具体区别,用哪一个比较好呢. 二就是课题的选择,以前的师兄师姐做小游戏的比较多,但我在图书馆看这方面的书籍,对一个

用JavaSE做一个简单的QQ项目,求大神们帮助,求全方面的注释

问题描述 javaSE快结束了,SE结束,我们就面临着项目的到来.兄弟连培训机构要求我们做一个QQ项目,只要实现单聊,全聊,登录界面,注册界面.求大神们帮帮忙..

纯干货!如何做一个成功的大数据项目

1.失败大数据项目的特征 根据在美国做了15年的大数据项目.产品研发和管理,以及其它一些相关的数据分析的工作经验,了解到的其它的做的比较成功的和失败的项目,跟大家做一个经验分享.基本上大数据项目失败的特征主要是五个: 一是大数据项目与企业战略脱节,完全是领导或者是不知道那个部门的决策人突然脑子一热,就说别人在用,我们也做一个,根本没有把该做的项目和企业的商业战略.科技战略等各个方面结合起来.在项目无法与战略协调,无法在战略的指导下做一款产品或者是服务项目的时候,失败的可能性会非常大. 二是大数据

eclipse-我在做一个医院挂号预约的项目

问题描述 我在做一个医院挂号预约的项目 有找医院,找科室模块,我想点击找科室后跳转到科室界面,可是我不知道怎么把科室排列起来,就像,有内科,点击旁边就有心血管内科之类的排列,外科也一样,内科,外科等大类竖向排列,它们的子类,横向显示,用GridView吗? 解决方案 参考这个完整的例子http://download.csdn.net/detail/lij71/8242811 解决方案二: 我在做一个项目中碰到的loadLibrary的问题 SOS!!!在做一个SSH项目的时侯遇到困难了~~~~~

优秀的网页设计对一个创业项目的价值有多大?

  上周去见了个朋友,是个创业的设计师.和他聊了很久,很愉快,也倍感压力.为了方便大家阅读,我用了访谈的形式来整理了这篇文章,这也是优设原创文章的一次新尝试,希望大家能喜欢!(我争取为大家以后多分享这样的文章,因为这是我们设计师的未来,真正属于设计师的生活.而我过去的那些老朋友,他们确实在业内做的不错,算是创业小有成就吧!如果大家感兴趣,我也可以邀请他们到我们的讲座群做语音分享,看大家评论的呼声吧) 经朋友介绍,我接触到了这家创业公司,抱着那么一点好奇心,我认识了他们的负责人rain,他是从零开

用JS做一个控制按钮具体代码该如何

问题描述 用JS做一个控制按钮具体代码该如何 button onclick="parent.d.ubto('1001|1|无聊|" />自动=停止 用JS做一个控制按钮 点击自动则开始自动发送点击停止则停止发送 解决方案 通过按钮的value来控制就好了.点击的时候同时设置按钮的值,和个开关一样 <input type="button" id="btnState" value="自动" onclick="