c++,用VC6与opencv目前只想把图像显示出来,语法没错但无法显示,有什么问题求教大神

问题描述

c++,用VC6与opencv目前只想把图像显示出来,语法没错但无法显示,有什么问题求教大神

实验5 类和对象
实验目的
掌握类和对象的创建
掌握构造函数、构造函数的重载,拷贝构造函数、析构函数的设计和使用
掌握成员函数的设计和使用
实验内容
下面的代码已经创建了图像类的框架,请完善该图像类。在该类中,实现图像的读入、保存、显示,并实现图像的翻转、缩放、裁剪等操作。在主程序中,读入某个图像文件(比如“fruits.jpg”) ,对其进行缩小,上下翻转,左右翻转,指定区域裁剪等操作。
[使用多文件结构设计该类,即类的声明代码在.h文件中,类的实现代码在.cpp文件中,main函数的代码在另一个.cpp文件中。]
请编程实现:
图像类:
1.创建图像类Image,实现各个重载的构造函数,拷贝构造函数(深拷贝),析构函数。
2.实现对图像的读入,保存,显示。即实现函数Read,Show,Write。
3.获取图像中某像素点的值。即实现函数At()。
4.将图像中给定像素点的像素值设置为某值,即实现函数Set。将图像所有像素的像素值设定为某值,即实现函数SetAll。
5.同一个函数实现图像的上下翻转、左右翻转。即实现函数Flip。
6.根据指定区域裁剪图像。
7.求图像的均值,方差。
8.图像的旋转,缩放。
9.定义友元函数交换两个Image对象的数据。
在函数中实现:
10.创建Image类对象img。
11.读入文件中的图像“fruits.jpg”,并显示。
12.利用Image类的成员函数,对图像进行翻转、旋转,并显示。
13.利用Image类的成员函数,将图像长宽缩小到1/2大小,并显示;将图像长宽放大2倍,并显示。
14.利用拷贝构造函数,创建新的对象new_img。
15.给定的两个点(Point):左上点(top_left)和右下点(bottom_right),将此指定区域内的new_img对象图像进行裁剪操作,并显示结果。
16.求图像的所有像素点的均值和方差,并输出。
17.交换两个Image对象的数据。
Image.h
#ifndef IMAGE_H
#define IMAGE_H
class Image
{
public:
Image(); //无参数的构造函数,创建行列都为零的Image对象
Image(int h, int w); //构造函数重载,创建h行,w列的Image对象
Image(int h, int w, unsigned char val); //构造函数重载,创建的图像像素值都为val;
Image(char* ImageName); //构造函数重载,利用文件名从硬盘加载图像文件成为Image对象;
Image(unsigned char m, int rows, int cols); //构造函数重载,从一维静态数组创建Image对象,图像的行数和列数由后面两个参数给出;
Image(unsigned char m[][100], int rows); //构造函数重载,从静态二维数组创建Image对象,图像的行数(二维数组的第一个维度)由第二个参数rows给出;
Image(unsigned char **m, int h, int w); //构造函数重载,从动态数组(二级指针)创建Image对象,图像的行数和列数由后面两个参数给出;
Image(const Image &im); //拷贝构造函数;
~Image(); //析构函数;
void Read(char
ImageName); //从硬盘文件中读入图像数据;
void Write(char* filename); //将图像数据保存为图像文件;
void Show(char* winname); //显示图像;
unsigned char& At(int row, int col); //获取第row行第col列的像素点的值;
void Set(int row, int col, unsigned char value); //设置像素(row,col)为某值;
void SetAll(unsigned char value); //设置图像所有像素为同一值;
void Flip(int code); //图像的翻转; 根据code的值:0:左右翻转,1:上下翻转;
void Resize(int code); //图像的缩放;根据code的值:0:缩小一倍,1:放大一倍;
void Cut(int x1,int y1,int x2,int y2);//裁剪点(x1,y1)到点(x2,y2)的图像
void Rotate(int degree);//图像旋转的函数(简单起见,旋转角度为90度的整数倍)
void Mean_Variance(float &m, float &var);//求图像的均值和方差,利用参数输出
friend void Swap(Image &a, Image &b);//使用友元函数交换两个Image对象的数据
private:

unsigned char **data;
int height;
int width;
};
#endif
Image.cpp
#include "cv.h"
#include "highgui.h"
#include "Image.h"
//构造函数
Image::Image()
{
//write your code here
}
//构造函数重载
Image::Image(int h, int w)
{
//write your code here
}
// 其他重载构造函数的实现
// ......
//拷贝构造函数
Image::Image(const Image &im)
{
//write your code here
}
//析构函数
Image::~Image()
{
//write your code here
}
//从硬盘读入图像文件;
void Image::Read(char* ImageName)
{
IplImage* img = cvLoadImage(ImageName, CV_LOAD_IMAGE_GRAYSCALE);
unsigned char img_data = (unsigned char *)(img->imageData);
int widthstep = img->widthStep;
//将一维指针img_data指向的内存中的值写入成员变量二维指针data所指的内存中
//write your code here
cvReleaseImage(&img);
}
//保存图像;
void Image::Write(char filename)
{
IplImage img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
unsigned char *img_data = (unsigned char *)(img->imageData);
int widthstep = img->widthStep;
//将成员变量二维指针data所指内存中的值写入一维指针img_data所指的内存
//write your code here
cvSaveImage(filename, img);
cvReleaseImage(&img);
}
//显示图像;
void Image::Show(char *winname)
{
IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
unsigned char *img_data = (unsigned char *)(img->imageData);
int widthstep = img->widthStep;
//将data所指内存中的值写入img_data所指的内存
//write your code here
cvNamedWindow(winname, CV_WINDOW_AUTOSIZE);//创建窗口
cvShowImage(winname, img);
cvWaitKey(0);
cvReleaseImage(&img); //释放图像;
}
//获取图像中指定点的值
unsigned char& Image::At(int row, int col)
{
//write your code here
}
//设置图像为同一值
void Image::Set(unsigned char value)
{
//write your code here
}
//false 左右,true 上下;
void Image::Flip(int code)
{
//write your code here
}
//图像缩小,放大
void Image::Resize(int code)
{
//write your code here
}
//图像裁剪的函数
//图像旋转的函数
//write your code here
//实现友元函数,交换两个Image对象的数据
void Swap(Image &a, Image &b)
{
}
CppExp.cpp
#include “Image.h”
int main(int argc, char
argv[])
{
Image img; //创建对象
img.Read("Fruits.jpg");
//img.Write("FruitsCopy.jpg");
cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
img.Show("Image");
cvWaitKey(0); //等待按键

//write your code here
//实现图像的左右翻转,如img.Flip(true);并显示

//实现图像的上下翻转,显示

//实现图像的缩放,显示

//获取图像的某点的像素值,并修改

//使用拷贝构造函数创建新的对象
Image new_img(img);
//截取指定区域内的图像,并显示
//旋转图像并显示(简单起见,旋转角度为90度的整数倍)
//求图像的均值和方差,并在命令行输出
//交换两个图像的数据
Image img1("Baboon.jpg");
Image img2("Lena.jpg");
img1.Show("Image1");
img2.Show("Image2");
cvWaitKey(0); //等待按键
Swap(img1, img2);
img1.Show("Image1");
img2.Show("Image2");
cvWaitKey(0); //等待按键
return 0;
}
实验要求
完成上述代码,并能显示正确的结果图像。

下面是我自己编写的代码:
#include "cv.h"
#include "highgui.h"
#include "Image.h"
#include

Image::Image() //无参数的构造函数,创建行列都为零的Image对象
{
width=0;
height=0;
}

Image::Image(int h, int w)//构造函数重载,创建h行,w列的Image对象
{
height=h;
width=w;
}

Image::Image(char* ImageName)
{
IplImage* img = cvLoadImage("Fruits.jpg", CV_LOAD_IMAGE_GRAYSCALE);
}

Image::DrawPixel(IplImage* img,int row, int col, unsigned char v)
{
unsigned char *img_data = (unsigned char *)(img->imageData);
int width_step = img->widthStep;
img_data[width_step * row + col] = v;
}

Image::Image(IplImage *img, int height, int width, unsigned char val)
{
int a,b;
for(a=0;a<=height-1;a++)
{
for(b=0;b<=width-1;b++)
{
DrawPixel(img,a,b,val);

    }

}
return;

}

/*Image::Image(IplImage img)
{
unsigned char *img_data = (unsigned char *)(img->imageData);
int height=img->height;

int width=img->width;
int x;
unsigned char **a; //动态声明一个二维数组
a=new unsigned char *[height];

a[0] =new unsigned char[height * width];

for (x=1;x<height;x++)
{
a[x]=a[x-1]+width;
}
}
/

void Image::Read(char* ImageName,unsigned char **a)
{
IplImage* img = cvLoadImage(ImageName, CV_LOAD_IMAGE_GRAYSCALE);
unsigned char *img_data = (unsigned char *)(img->imageData);
int widthstep = img->widthStep;
int height=img->height;

int width=img->width;
cout<<height;
//unsigned char **a;
int x,y,z=0;

for(x=0;x<width;x++)
{
for(y=0;y<height;y++)
{
a[x][y]=img_data[z];

z++;
}
}

for(int i = 0;i < height;i++)
{
    delete a[i];
    a[i] = NULL;
}
delete [height]a;
a = NULL; 

cvReleaseImage(&img);

}

void Image::Write(char filename)
{
IplImage
img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
unsigned char *img_data = (unsigned char *)(img->imageData);
int widthstep = img->widthStep;
int height=img->height;

int width=img->width;
unsigned char **a;
int x,y,z=0;

for (x=0;x<width;x++)
{
for (y=0;y<height;y++)
{
img_data[z]=a[x][y];

z++;

}

}

cvSaveImage(filename, img);
cvReleaseImage(&img);

}

void Image::Show(char *winname)
{
IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
unsigned char *img_data = (unsigned char *)(img->imageData);
int widthstep = img->widthStep;

int height=img->height;
int width=img->width;
unsigned char **a;
int x,y,z=0;
for (x=0;x<width;x++)
{
    for (y=0;y<height;y++)
    {
         img_data[z]=a[x][y];
        z++;
    }
}   

cvNamedWindow(winname, CV_WINDOW_AUTOSIZE);//创建窗口
cvShowImage(winname, img);
cvWaitKey(0);
cvReleaseImage(&img); //释放图像;

};

Image::~Image()
{
//write your code here
}

int main(int argc, char* argv[])
{
Image img; //创建对象
IplImage* img1 = cvLoadImage("Fruits.jpg", CV_LOAD_IMAGE_GRAYSCALE);
unsigned char *img1_data = (unsigned char *)(img1->imageData);
int height=img1->height;

int width=img1->width;
int x;
unsigned char **a; //动态声明一个二维数组
a=new unsigned char *[height];

a[0] =new unsigned char[height * width];

for (x=1;x<height;x++)
{
a[x]=a[x-1]+width;
}
Image("Fruits.jpg");
img.Read("Fruits.jpg",a);
//img.Write("FruitsCopy.jpg");

//cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
//img.Show("Image");
//cvWaitKey(0); //等待按键

return 0;

}

结果是这样的,为什么呢,我只想先把图像显示出来:

解决方案

你怎么用的控制台程序?参考
http://blog.csdn.net/joeblackzqq/article/details/10363465

时间: 2024-11-03 22:46:21

c++,用VC6与opencv目前只想把图像显示出来,语法没错但无法显示,有什么问题求教大神的相关文章

table-java web开发,ssh框架,我想询问下载jsp里,下面的表格怎么制作?求大神指导

问题描述 java web开发,ssh框架,我想询问下载jsp里,下面的表格怎么制作?求大神指导 下边是形成的效果,行是固定的就是1到4:列也是固定的就是第一年到第六年. 跪求大神指导 解决方案 http://blog.csdn.net/cuishijin/article/details/1577009 这里面总结了一些资料,你可以去看下 解决方案二: table tr td

jquery下拉菜单在浏览器中只显示1像素,求大神帮帮忙

问题描述 jquery下拉菜单在浏览器中只显示1像素,求大神帮帮忙 本人小菜鸟一枚,用jquery写了个简单的下拉菜单,代码如下:$(document).ready(function(){ $(""#navRight .jiantou"").hover(function(){ $(this).find("".xiangq"").stop().slideDown(""slow""); }f

class-本人新手刚学习两天我想问一下为什么我的break用法到底哪错了谢谢各位大神了

问题描述 本人新手刚学习两天我想问一下为什么我的break用法到底哪错了谢谢各位大神了 就是驱1到100前五个被三整除的数字 public class For{ public static void main(String[] args){ int i=1, num=0; while(i<=100);{ if(i%3==0){ System.out.print(i+" "); num++; } if(num==5){ break; } i++; } } } 解决方案 while后

ios 缓存 记住密码-想实现 手机app 记住密码和账户的功能 不知道哪位大神传授一下!

问题描述 想实现 手机app 记住密码和账户的功能 不知道哪位大神传授一下! 百度上让下载keychainitemwrapper但是我放到项目中报错,没发用啊- 解决方案 页面的话 是通过cookie可以实现保存用户名和密码, 不知道你这个有么有类似的

我想做一个类似163邮件标记的东西,请问有没有大神有类似的例子呀

问题描述 我想做一个类似163邮件标记的东西,请问有没有大神有类似的例子呀 就是给某些 条目增加标签.类似163的邮件后面的那种....谢谢

我正在做一个项目,需要聊天工具,想用环信的,请问怎么集成添加呀,求大神指教呀!!

问题描述 解决方案 重复发送是因为是在给自己发消息,发一条接收一条:即登录的是A账号,又跟A创建会话发送消息,则会出现上述现象.将创建会话的对象修改一下即可.解决方案二:官网有集成文档,可以先看下,解决方案三:我也看视频了,根据视频一步一步来操作的,可还是报错,这个是截图,求大神指点!!!解决方案四:删掉parse所有相关.parse只是demo用来显示头像的一个示范,一个解决方案.在自己集成的时需要自己去实现头像和昵称的显示,并且维护在自己的服务器.常用的方案有http://docs.ease

c++-关于C++字符串流程序在vc6和vs2005下运行不一致问题,求大神给解释!!!

问题描述 关于C++字符串流程序在vc6和vs2005下运行不一致问题,求大神给解释!!! string input; cin>>input; int len = 0; string strtmp; istringstream strstream(input); strstream>>len>>strtmp; 以上程序在vc6和vs2005运行不一致,不知道是小弟机器原因还是什么问题,很困惑,同样的程序怎么运行不一样呢, 难道是vc6编译器和vs2005编译器差别???

Photoshop如何制作只想陪你一直走下去的签名?

  本教程主要使用Photoshop制作只想陪你一直走下去签名教程,喜欢的朋友让我们一起来学习吧. 效果图: 教程: 素材 背景素材: 素材①: 素材②: 纸片素材: 调色的数值:[截图截取的比较失败--] 人物塬图:         注:更多精彩教程请关注三联photoshop教程栏目,三联PS群:339853166欢迎你的加入 分类: PS入门教程

共享文件夹-我共享了一个文件夹只想让局域网内指定的两个电脑访问,其他电脑没有权限访问如何设置?

问题描述 我共享了一个文件夹只想让局域网内指定的两个电脑访问,其他电脑没有权限访问如何设置? 求大侠帮忙,有详细的步骤,万分感谢 下面是在百度上搜到的答案,我试了,但是删除everyone后,电脑就无法访问共享文件夹了 winxp局域网中设置共享文件夹权限 假定有三台电脑分别是 Computer01 Computer02 Computer03 用户分别是 Computer01User01 Computer02User02 Computer03User03 Computer01User01 想把自