当前位置:首页 » 编程语言 » 用c语言实现抠图
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

用c语言实现抠图

发布时间: 2022-08-01 01:22:42

A. vc6.0对图像的操作的代码,高分跪求!

这点钱真心不够劳务费的

B. 如何用c语言编程实现 把图片转换成有漫画效果的

先调用
图片库

把图片打开,存入内存里,然后把每个像素点的RGBV值改成想要的效果,
然后再写入文件。图片的操作可惜不能贴地址

C. VC如何实现抠图功能

类似抠图把,给图像加上mask,完后把mask保存下来,仅供参考



#include<iostream>//forstandardI/O
#include<string>//forstrings
#include<iomanip>//
#include<sstream>//stringtonumberconversion

#include<opencv2/imgproc/imgproc.hpp>//GaussianBlur
#include<opencv2/core/core.hpp>//BasicOpenCVstructures(cv::Mat,Scalar)
#include<opencv2/highgui/highgui.hpp>//OpenCVwindowI/Ousingnamespacestd;
usingnamespacecv;


//images
MatinputImg,showImg,segMask,segShowImg;

//mask
MatfgScribbleMask,bgScribbleMask;


//userclickedmousebuttonsflags
boolrButtonDown=false;
boollButtonDown=false;
intscribbleRadius=5;


//mouselistener
staticvoidonMouse(intevent,intx,inty,int,void*)
{
//cout<<"OnMouse:("<<x<<","<<y<<")"<<endl;


if(event==CV_EVENT_LBUTTONDOWN)
{
lButtonDown=true;

}
elseif(event==CV_EVENT_RBUTTONDOWN)
{
rButtonDown=true;

}
elseif(event==CV_EVENT_LBUTTONUP)
{
lButtonDown=false;
}
elseif(event==CV_EVENT_RBUTTONUP)
{
rButtonDown=false;
}
elseif(event==CV_EVENT_MOUSEMOVE)
{
if(rButtonDown)
{
//scribblethebackground

circle(bgScribbleMask,Point(x,y),scribbleRadius,0,-1);
circle(showImg,Point(x,y),scribbleRadius,CV_RGB(0,0,255),-1);

}
elseif(lButtonDown)
{
//scribbletheforeground

circle(fgScribbleMask,Point(x,y),scribbleRadius,0,-1);
circle(showImg,Point(x,y),scribbleRadius,CV_RGB(255,0,0),-1);

//fgScribbleMask.at<char>(y,x)=(char)255;
//setvariablesusingmask
//showImg.setTo(redColorElement,fgScribbleMask);

//showImg.at<Vec3b>(y,x)[0]=0;
//showImg.at<Vec3b>(y,x)[1]=0;
//showImg.at<Vec3b>(y,x)[2]=255;
}

}


imshow("ScribbleImage",showImg);
imshow("fgmask",fgScribbleMask);
imshow("bgmask",bgScribbleMask);
}


//cleareverythingbeforeclosing
voiddestroyAll()
{
//destroyallwindows
destroyWindow("InputImage");
destroyWindow("ScribbleImage");


destroyWindow("bgmask");
destroyWindow("fgmask");
destroyWindow("SegmentationMask");
destroyWindow("SegmentationImage");

//clearalldata
fgScribbleMask.release();
bgScribbleMask.release();
inputImg.release();
showImg.release();

segMask.release();
segShowImg.release();}

//initallimages/vars
intinit(char*imgFileName)
{
//Readthefile
inputImg=imread(imgFileName,CV_LOAD_IMAGE_COLOR);
showImg=inputImg.clone();
segShowImg=inputImg.clone();//Checkforinvalidinput
if(!inputImg.data)
{
cout<<"Couldnotopenorfindtheimage:"<<imgFileName<<std::endl;
return-1;
}

//
fgScribbleMask.create(2,inputImg.size,CV_8UC1);
fgScribbleMask=255;
bgScribbleMask.create(2,inputImg.size,CV_8UC1);
bgScribbleMask=255;
segMask.create(2,inputImg.size,CV_8UC1);
segMask=0;


//Createawindowfordisplay.
namedWindow("InputImage",CV_WINDOW_AUTOSIZE);
namedWindow("ScribbleImage",CV_WINDOW_AUTOSIZE);

namedWindow("fgmask",CV_WINDOW_AUTOSIZE);
namedWindow("bgmask",CV_WINDOW_AUTOSIZE);


//Showourimageinsideit.
imshow("InputImage",inputImg);
imshow("ScribbleImage",showImg);

imshow("fgmask",fgScribbleMask);
imshow("bgmask",bgScribbleMask);


moveWindow("ScribbleImage",1,1);
moveWindow("InputImage",inputImg.cols+50,1);
moveWindow("BinPerPixel",2*(inputImg.cols+50),1);
moveWindow("Edges",2*(inputImg.cols+55),1);


//setthecallbackonmouse
setMouseCallback("ScribbleImage",onMouse,0);


return0;
}


intmain(intargc,char*argv[])
{

Stringimage_name,numBinsStr,bhaSlopeStr;
cout<<"inputParameters:"<<endl;
cout<<"imagename:";
cin>>image_name;


//getimgnameparameter
char*imgFileName=(char*)image_name.c_str();


if(init(imgFileName)==-1)
{
cout<<"Couldnotinitialize"<<endl;
return-1;
}//Waitforakeystrokeinthewindow
for(;;)
{
charkey=waitKey(0);
switch(key)
{
case'q':
cout<<"goodbye"<<endl;
destroyAll();
return0;
case'-':
//缩小画笔直径
if(scribbleRadius>2)
scribbleRadius--;
cout<<"currentradiusis"<<scribbleRadius<<endl;
break;
case'+':
if(scribbleRadius<100)
scribbleRadius++;
cout<<"currentradiusis"<<scribbleRadius<<endl;
break;
case's':
{


//thisiswherewestoretheresults
segMask=0;
inputImg.To(segShowImg);
//inputImg.To(showImg);


imwrite("bg.bmp",bgScribbleMask);

break;

}
case'r':
{
cout<<"resetting"<<endl;
destroyAll();
if(init(imgFileName)==-1)
{
cout<<"couldnotinitialize"<<std::endl;
return-1;
}
break;
}
}
}


return0;
}

D. 用c语言如何实现图形操作

graph的相关库对windows支持不好
我曾经遇到过同样的问题

1年前左右吧,我在学校用win98,tc2.0环境下编的俄罗斯方块,发到网上,n多人说不好用,我就不信,结果拿回家是win xp的环境,确实就不好用了

c语言的很多图形库(包括内联下的鼠标操作 和键盘中断操作) 在win xp下都不好用……
因为好像C语言的编译是这样子的:他是发给一个请求,先格外开一个图形的界面,然后对图形的操作都是在这个界面上的

我曾经遇到的还有一个问题是printf,在图形界面下显示也不好的问题

E. 用C语言如何编写一个石头剪子布的程序

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

void main()

{

int com,user;

char c;

srand((unsigned)time(NULL)); //初始化随机数,如果没有这条语句,每次运行电脑产生的随机数序列都是一样的

printf("进入游戏 ");

do{

printf("请出拳(1.剪刀、2.石头、3.布):");

scanf("%d",&user);

com=rand()%3+1; //产生1-3范围内的随机数

printf("电脑出%s ",com==1?"剪刀":com==2?"石头":"布");

switch(com-user) //用电脑产生的数和用户输入的数的差值来判断胜负

{

case 0:

printf("平手 ");

break;

case 1:

case -2:

printf("电脑赢了 ");

break;

case -1:

case 2:

printf("你赢了 ");

}

printf("继续游戏按Y键、其它键退出");

getchar();

c=getchar();

}while(c=='y' || c=='Y');

printf("已经退出游戏");

}

(5)用c语言实现抠图扩展阅读

C++编程: 石头剪子布

#include<cstdio>

#include<iostream>

using namespace std;

int main()

{

int n;

char a[10],b[10];

cin>>n;

int c[n+3];

for(int i=1;i<=n;i++)

{

cin>>a>>b;

if(a[0]=='R')

{

if(b[0]=='R')

{

c[i]=0;

}

if(b[0]=='S')

{

c[i]=1;

}

if(b[0]=='P')

{

c[i]=2;

}

}

else if(a[0]=='S')

{

if(b[0]=='R')

{

c[i]=2;

}

if(b[0]=='S')

{

c[i]=0;

}

if(b[0]=='P')

{

c[i]=1;

}

}

else if(a[0]=='P')

{

if(b[0]=='R')

{

c[i]=1;

}

if(b[0]=='S')

{

c[i]=2;

}

if(b[0]=='P')

{

c[i]=0;

}

}

}

for(int i=1;i<=n;i++)

switch(c[i])

{

case 0:

{

printf("Tie ");break;

}

case 1:

{

printf("Player1 ");break;

}

case 2:

{

printf("Player2 ");break;

}

}

return 0;

}

F. PopFore抠图软件怎么用


1.启动PopFore:PopFore是纯绿色软件,无需安装即可使用。下载解压后双击Popfore.exe启动PopFore主程序,您将看到如下图所示的界面。右下角显示的是即时帮助提示。
2.打开输入图像:打开图像后您将看到如下图所示的界面,在这里您需要注意画刷工具栏和视图控制按钮。
画刷工具栏,在视图上单击右键可将画刷工具栏移动到鼠标所在的位置;
视图控制按钮,每个字母对应视图的一种显示模式(S=源图,A=alpha图,B=背景图,F=前景图,C=合成图);
3.使用alpha画刷添加种子像素标记,即告诉抠图算法哪些区域是前景,哪些区域是背景。如下图所示,黄色笔刷表示所覆盖的像素为前景;蓝色笔刷表示所覆盖的像素为背景。
界面的右侧显示了两个辅视图,在您添加种子像素标记的同时,即可从这两个视图观察到抠图结果。
按SHIFT键可使alpha画刷的状态在前景和背景间切换。
4.切换主视图的显示模式到alpha图,继续添加标记。在alpha图上交互的好处是您可以对照着当前结果,将标记添加到包含错误最多的区域。这将比在源图上交互更直观、更有效率。
5.继续添加标记,直到得到一张基本正确的alpha图。按下V键可显示/隐藏笔刷的痕迹;为了更好地观察抠图结果,可使用“拾取背景色”工具改变合成图的背景色。
6.点击模式切换按钮进入精修模式,此时保存按钮将变得可用。对于背景比较简单的情况,通过智能抠图算法得到的结果已经基本正确。如果您对抠图质量要求不是很高的话,就可以保存抠图结果了。
7.保存:抠图结果可被保存成透明的.png图像,您可以选择保存前景或只保存alpha图,展开保存菜单可进行选择。
.png格式采用的是无损压缩,因此您不必担心保存会损失质量;
快速保存,将抠图结果按默认路径保存(前景和alpha图分别保存到与源图像同目录下的*_f.png和*_a.png);
合成图的背景色并不影响保存结果,PopFore暂不提供背景替换的功能;抠图完成后,您可以将保存的结果导入其它图像编辑软件中,与任意新背景合成;

G. VC6.0或VS2010对图片操作

你终于肯放弃vc6了?其实有gdi+ sdk的话vc6也可以……
既然提到vs2010了,那么我说一下gdi+的做法。

1、从文件创建一个Image对象(Image::FromFile
2、根据要保存的部分的大小(分辨率)创建一个Bitmap对象(直接用它构造函数即可
2、从Bitmap对象创建一个Graphics对象(Graphics::FromImage
3、调用Graphics对象上的DrawImage方法,
g->DrawImage(步骤1的Image对象指针, 0, 0, x, y, w, h, UnitPixel);
其中x、y是要截取的部分的左上角的坐标,w和h是要截取的部分的大小(也就是目标图像的分辨率,步骤2中创建的图像的分辨率
4、调用Graphics对象上的Flush方法确保数据都写入Bitmap对象了
5、调用步骤2创建的Bitmap对象上的Save方法保存文件,这个具体你可以上网搜,关于那些clsid啥的应该送什么参数

H. 在电脑上如何扣图

1、打开电脑上的ps,放入图片素材后解锁背景图层。2、点击菜单栏中的选择找到主体并点击。3、按下键盘上的CTRL+SHIFT+I反选区域删除背景。4、按下键盘上的CTRL+D释放选区即可。5、根据以上步骤即可在ps中把背景去掉。 注意事项:1、首先解锁背景图层。2、点击主体后会有三秒加载时间。
ps抠图方法大全8种方法有哪些?请看下面方法。
方法1:钢笔工具抠图
1/8
钢笔工具适用于外形复杂,不连续、色差不大的图,加工精度高、纯手工放大边界点来抠图,首先将需要抠图的素材拖到ps中

WinMAC软件PS在线激活安装中文版免费下载广告
2/8
然后利用快捷键“Ctrl+J”复制一层图层

3/8
然后选择“钢笔工具”

WinMAC软件PS在线激活安装中文版免费下载广告
4/8
接着在需要抠图的地方描点

5/8
将需要抠出来的部分都圈住后点击鼠标右键,选择“建立选区”

6/8
然后调整羽化半径,根据描点距离图片的距离选择,勾选“消除锯齿”后点击“确定”

7/8
接着就建立好选区,可以利用快捷键“Ctrl+C”复制选区的图层

8/8
然后在一个空白图层利用快捷键“Ctrl+V”粘贴即可完成抠图

方法2:魔术棒抠图
1/5
魔术棒抠图适用于图像和背景色色差明显,背景单一,图像边界清晰的素材,首先将图片素材利用ps打开

2/5
接着点击“魔棒工具”

3/5
然后调整容差值为“32”,勾选“连续”和“消除锯齿”

4/5
然后利用魔棒工具点击图片的背景区,选择一个区域后点击键盘上的删除键

5/5
把背景全部删除后即可完成抠图

方法3:色彩范围抠图
1/7
色彩范围抠图适用于背意景色单一,图像分明、背景无色彩的素材。首先利用Ps打开图片素材

2/7
接着点击“选择”选项卡

3/7
然后在弹出的选项中选择“色彩范围”

4/7
然后用颜色吸管拾取背景色

5/7
接着勾选“反相”并点击“确定”

6/7
然后会建立一个选区

7/7
最后利用快捷键“Ctrl+J”复制一层图层即可完成抠图

方法4:磁性索套工具抠图
1/5
磁性套索抠图适用于图像边界清晰,磁性索套会自动识别并黏附在图像边界上,如果边界模糊处放大了再放置这样就更精确,首先利用ps打开图片素材

2/5
然后选择“磁性套索工具”

3/5
接着将鼠标移到图像边界处,然后磁性套索工具自动识别并黏附在图像边界上

4/5
等磁性套索工具闭合后就将整个图像都选中了

5/5
然后利用快捷键“Ctrl+J”复制一层图层即可完成抠图

方法5:羽化法抠图
1/8
羽化法抠图适用于边界清楚的素材,首先利用ps打开图片素材

2/8
然后选择“套索工具”

3/8
接着利用套索工具将图像选中

4/8
然后点击鼠标右键,选择“羽化”

5/8
根据套索与图像的距离调整羽化半径,距离较近就调小点,如调整羽化半径为“5”后点击“确定”

6/8
然后就将图像抠出来了,但是周围有不需要的部分,可以利用橡皮擦工具擦去

7/8
点击选择“橡皮擦工具”

8/8
将周围多余的部分擦去即可完成抠图

方法6:蒙板抠图
1/7
蒙板抠图快速并直观适用范围广,首先利用ps打开图片素材

2/7
然后利用快捷键“Ctrl+J”复制一层图层

3/7
然后选择“图层1”并点击“添加图层蒙版”

4/7
接着将前景色调为黑色,背景色调为白色

5/7
调好后选择“画笔工具”

6/7
调整画笔工具的颜色为黑色,并选择图层蒙版

7/7
接着利用画笔工具将背景擦去即可完成抠图,如果不小心将图像擦掉了,可以交换前景色和背景色在擦除即可还原

方法7:通道抠图
1/16
通道抠图适用于色差不大,外形复杂的图形,像毛发及树枝等。首先利用ps打开图片素材

2/16
然后利用快捷键“Ctrl+j”复制一层图层

3/16
接着点击“通道”

4/16
选择并复制一个图像清楚的通道,如“蓝色”

5/16
然后点击“图像”选项卡

6/16
选择“调整”下的“色阶”

7/16
然后调整色阶以增强图像对比度,调整好后点击“确定”

8/16
接着选择“快速选择工具”

9/16
将图像选中,边界处可以放大在选择

10/16
选择好后点击“编辑”选项卡

11/16
在弹出来的选项中选择“填充”

12/16
将图像填充为背景色即为黑色,点击“确定”

13/16
然后选择“图像”选项卡

14/16
选择调整下的“反相”将背景设置为白色

15/16
接着利用快捷键“Ctrl+J”复制一层图层

16/16
接着将图层1和背景的“小眼睛”关闭即可查看抠出来的图像

方法8:反向抠图
1/7
找到图片,点击打开。

2/7
点击使用魔棒工具。

3/7
点击外部空白区域。

4/7
点击右键,点击“选择反向”。

5/7
再点击右键,选择通过拷贝(剪切)的图层。

6/7
删除背景图层。

7/7
如图,抠图完成。

怎样在电脑上扣图截图有时,在电脑上阅读新闻或其他资料时,发现有些图片或资料片段很是精彩,非常值得保存。但是,由于技术原因,自己的想法又无法实现。为此,特求教于高手,很快解决了这一难题。现将其方法介绍于下,和大家共通分享:1、现将要抓扣的图片资料框定。2、手指点击键盘上的Print Screen键(或prtsc sysRq),此键有的在键盘上面第一行的F12键后面。3、点击电脑左右下角“开始”,==“程序”==“附件”==“画图”。4、出现新的“未命名-画图”模板,点击左上角“编辑”==“黏贴”。5、将所黏贴的图片资料保存到自己最熟悉和容易找到的位置。或直接打印等。6、将所黏贴的图片有时需转换成jpg格式,否则无法运用到其他位置。7、至此你的扣图用图愿望就实现了。2