
既然提到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啥的应该竖亏送什么参数
类似抠图把,给图像加上mask,完后把纯旁mask保存下来,仅供参考
#include <iostream> // for standard I/O
#include <string> // for strings
#include <iomanip> // for controlling float print precision
#include <sstream> // string to number conversion
#include <opencv2/imgproc/imgproc.hpp> // Gaussian Blur
#include <opencv2/core/core.hpp> // Basic 做裂橡OpenCV structures (cv::Mat, Scalar)
#include <opencv2/highgui/highgui.hpp> // OpenCV window I/O
using namespace std
using namespace cv
// images
Mat inputImg, showImg, segMask, segShowImg
// mask
Mat fgScribbleMask, bgScribbleMask
// user clicked mouse buttons flags
bool rButtonDown = false
bool lButtonDown = false
int scribbleRadius = 5
// mouse listener
static void onMouse( int event, int x, int y, int, void* )
{
//cout << "On Mouse: (" << x << "," << y << ")" <<endl
if (event == CV_EVENT_LBUTTONDOWN)
{
lButtonDown = true
}
else if (event == CV_EVENT_RBUTTONDOWN)
{
rButtonDown = true
}
else if (event == CV_EVENT_LBUTTONUP)
{
lButtonDown = false
}
else if (event == CV_EVENT_RBUTTONUP)
{
rButtonDown = false
}
else if (event == CV_EVENT_MOUSEMOVE)
{
源拿 if (rButtonDown)
{
// scribble the background
circle(bgScribbleMask,Point(x,y),scribbleRadius, 0,-1)
circle(showImg,Point(x,y),scribbleRadius, CV_RGB(0,0,255),-1)
}
else if (lButtonDown)
{
// scribble the foreground
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
// set variables using mask
//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("Scribble Image", showImg)
imshow("fg mask", fgScribbleMask)
imshow("bg mask", bgScribbleMask)
}
// clear everything before closing
void destroyAll()
{
// destroy all windows
destroyWindow("Input Image")
destroyWindow("Scribble Image")
destroyWindow("bg mask")
destroyWindow("fg mask")
destroyWindow("Segmentation Mask")
destroyWindow("Segmentation Image")
// clear all data
fgScribbleMask.release()
bgScribbleMask.release()
inputImg.release()
showImg.release()
segMask.release()
segShowImg.release()
}
// init all images/vars
int init(char * imgFileName)
{
// Read the file
inputImg = imread(imgFileName, CV_LOAD_IMAGE_COLOR)
showImg = inputImg.clone()
segShowImg = inputImg.clone()
// Check for invalid input
if(!inputImg.data )
{
cout << "Could not open or find the image: " << imgFileName << std::endl
return -1
}
// this is the mask to keep the user scribbles
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
// Create a window for display.
namedWindow( "Input Image", CV_WINDOW_AUTOSIZE )
namedWindow( "Scribble Image", CV_WINDOW_AUTOSIZE)
namedWindow( "fg mask", CV_WINDOW_AUTOSIZE )
namedWindow( "bg mask", CV_WINDOW_AUTOSIZE )
// Show our image inside it.
imshow( "Input Image", inputImg )
imshow( "Scribble Image", showImg )
imshow("fg mask", fgScribbleMask)
imshow("bg mask", bgScribbleMask)
moveWindow("Scribble Image", 1,1)
moveWindow("Input Image", inputImg.cols + 50,1)
moveWindow("Bin Per Pixel", 2*(inputImg.cols + 50),1)
moveWindow("Edges", 2*(inputImg.cols + 55),1)
// set the callback on mouse
setMouseCallback("Scribble Image", onMouse, 0)
return 0
}
int main(int argc, char *argv[])
{
String image_name,numBinsStr,bhaSlopeStr
cout<<"input Parameters:"<<endl
cout<<"image name: "
cin>>image_name
// get img name parameter
char * imgFileName = (char *)image_name.c_str()
if (init(imgFileName)==-1)
{
cout << "Could not initialize" << endl
return -1
}
// Wait for a keystroke in the window
for ()
{
char key = waitKey(0)
switch (key)
{
case 'q':
cout << "goodbye" << endl
destroyAll()
return 0
case '-':
//缩小画笔直径
if (scribbleRadius > 2)
scribbleRadius --
cout << "current radius is " << scribbleRadius << endl
break
case '+':
if (scribbleRadius < 100)
scribbleRadius ++
cout << "current radius is " << scribbleRadius << endl
break
case 's':
{
// this is where we store the results
segMask = 0
inputImg.copyTo(segShowImg)
//inputImg.copyTo(showImg)
imwrite("bg.bmp",bgScribbleMask)
break
}
case 'r':
{
cout << "resetting" << endl
destroyAll()
if (init(imgFileName)==-1)
{
cout << "could not initialize" << std::endl
return -1
}
break
}
}
}
return 0
}
你好:的原因有很多,一般有以下几个方面:1. 程序设计不当:程序设计不合理,存在程序功能设计上的缺陷,导致在一些特定情况下出现意外退出的情况。
2. 编程问题:由于程序编卖笑写的不当,存在语法错误或逻辑错误袭纳,导致在使用过程中出现意外退出的情况。
3. 软件问题:由于软件本身存在漏洞,或者软件不兼容系统和硬件,也会导致程序意外退出的情况。
4. 硬件原因:由于系统中硬件资源不足,系统出现崩溃,也会导致程序意外退出的情况。谢谢提拍配没问
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)