计算机图形图像技术-复习参考题代码部分答案

前言

环境:Clion + OpenGL + OpenCV

按照书中代码进行复现或改造。若有错误,为保证即时性,请在博客文章下方留言,会及时更正。

最新更正结果以博客文章内为准:Aris_Blog:计算机图形图像技术-复习参考题代码部分答案

Edited by Aris. Last edited on July 6, 2019

OpenGL

T3

题目:请使用 OpenGL 和 GLUT 编写一个简单的图形程序,用于显示一个填充的白色矩形。其中矩形规定为(-0.8, -0.8)~(0.8, 0.8),程序窗口的大小为(200, 200),标题为“白色矩形”。

#include <GL/glu.h>
#include <GL/glut.h>

void Paint(){
    glClear(GL_COLOR_BUFFER_BIT);// 初始化颜色缓冲区
    // glColor3f(1, 0, 0); // 设置颜色为红色
    glRectf(-0.8, -0.8, 0.8, 0.8);
    glFlush();
}

int main(int argc, char **argv){
    glutInit(&argc, argv); // 做题不写
    glutInitWindowSize(200, 200); // 程序窗口大小
    glutCreateWindow("白色矩形"); // 窗口标题
    glutDisplayFunc(Paint); // 执行场景绘制函数
    glutMainLoop(); // 开始循环执行 OpenGL 命令
}
T4

题目:请使用 OpenGL 和 GLUT 编写一个简单的图形程序,用于显示一个填充的红色三角形。其中三角形的顶点分别是(-0.8, -0.8)、(0.8, -0.8)和(0, 0.8),程序窗口大小为(200, 200),标题为“红色三角形”

#include <GL/glu.h>
#include <GL/glut.h>

void Paint(){
    glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
    glColor3f(1, 0, 0); // 设置颜色为红色 (R, G, B)
    glBegin(GL_TRIANGLES); // 三角形
    glVertex2d(-0.8, -0.8); // 顺时针方向指定三顶点坐标,连线
    glVertex2d(0.8, -0.8);
    glVertex2d(0, 0.8);
    glEnd(); // 三角形定义结束
    glFlush();// 线段定义结束
}

int main(int argc, char **argv){
    glutInit(&argc, argv); // 做题不写
    glutInitWindowSize(200, 200); // 程序窗口大小
    glutCreateWindow("红色三角形"); // 窗口标题
    glutDisplayFunc(Paint); // 执行场景绘制函数
    glutMainLoop(); // 开始循环执行 OpenGL 命令
}
T5

题目:请使用OpenGL和GLUT编写一个简单的图形程序,用于显示一个填充的蓝色平行四边形。其中平行四边形的4个顶点分别是(-0.9, -0.4)、(0.4, -0.4)、(0.9, 0.4)和(-0.4, 0.4),程序窗口的大小为(300, 300),标题为“蓝色平行四边形”

#include <GL/glu.h>
#include <GL/glut.h>

void Paint(){
    glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
    glColor3f(0, 0, 1); // 设置颜色为蓝色 (R, G, B)
    glBegin(GL_QUADS); // 四边形
    glVertex2d(-0.9, -0.4); // 顺时针方向指定四顶点坐标,连线
    glVertex2d(0.4, -0.4);
    glVertex2d(0.9, 0.4);
    glVertex2d(-0.4, 0.4);
    glEnd(); // 定义结束
    glFlush();
}

int main(int argc, char **argv){
    glutInit(&argc, argv); // 做题不写
    glutInitWindowSize(200, 200); // 程序窗口大小
    glutCreateWindow("蓝色平行四边形"); // 窗口标题
    glutDisplayFunc(Paint); // 执行场景绘制函数
    glutMainLoop(); // 开始循环执行 OpenGL 命令
}
T6

题目:请使用OpenGL和GLUT编写一个简单的图形程序,用于显示一个填充的紫色梯形。其中梯形的4个顶点分别是(-0.9, -0.4)、(0.4, -0.4)、(0.4, 0.4)和(-0.4, 0.4),程序窗口的大小为(300, 300),标题为“紫色梯形”。

#include <GL/glu.h>
#include <GL/glut.h>

void Paint(){
    glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
    glColor3f(1, 0, 1); // 设置颜色为紫色 (R, G, B)
    glBegin(GL_QUADS); // 四边形
    glVertex2d(-0.9, -0.4); // 顺时针方向指定四顶点坐标,连线
    glVertex2d(0.4, -0.4);
    glVertex2d(0.4, 0.4);
    glVertex2d(-0.4, 0.4);
    glEnd(); // 定义结束
    glFlush();
}

int main(int argc, char **argv){
    glutInit(&argc, argv); // 做题不写
    glutInitWindowSize(200, 200); // 程序窗口大小
    glutCreateWindow("紫色梯形"); // 窗口标题
    glutDisplayFunc(Paint); // 执行场景绘制函数
    glutMainLoop(); // 开始循环执行 OpenGL 命令
}
T29

题目:请使用 OpenGL、GLU 和 GLUT 编写一个显示线框立方体的程序。其中立方体的半径为 1.5 单位,并首先绕(0, 0, 0)~(1, 1, 0)旋转 30 度,然后远移 6.5 单位;观察体规定为:视场角=30 度,宽高比=1,近=1,远=100;程序窗口的大小为(200, 200),标题为“线框立方体”

#include <GL/glu.h>
#include <GL/glut.h>

void Paint(){
    glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区

    glLoadIdentity(); // 初始化矩阵
    gluPerspective(30, 1, 1, 100); // 视角

    // 按照题意顺序写的,实际情况下面两行调换才能看到立方体
    glRotated(30, 1, 1, 0); // 绕(0, 0, 0)~(1, 1, 0)旋转 30 度
    glTranslated(0, 0, -6.5); // 远移 6.5 单位

    glutWireCube(1.5); //线框体,半径为 1.5 单位
    glFlush();
}

int main(int argc, char **argv){
    glutInit(&argc, argv); // 做题不写
    glutInitWindowSize(200, 200); // 程序窗口大小
    glutCreateWindow("线框立方体"); // 窗口标题
    glutDisplayFunc(Paint); // 执行场景绘制函数
    glutMainLoop(); // 开始循环执行 OpenGL 命令
}
T30

题目:请使用 OpenGL、GLU 和 GLUT 编写一个三维犹他茶壶程序。其中茶壶的半径为 1 单位,并远移 6.5 单位;观察体规定为:视场角=30 度,宽高比=1,近=1,远=100;程序窗口的大小为(200, 200),标题为“尤他茶壶”

#include <GL/glu.h>
#include <GL/glut.h>

void Paint(){
    glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区

    glLoadIdentity(); // 初始化矩阵
    gluPerspective(30, 1, 1, 100); // 视角
    glTranslated(0, 0, -6.5); // 远移 6.5 单位
    glutSolidTeapot(1); // 尤他茶壶,半径为 1 单位
    glFlush();
}

int main(int argc, char **argv){
    glutInit(&argc, argv); // 做题不写
    glutInitWindowSize(200, 200); // 程序窗口大小
    glutCreateWindow("尤他茶壶"); // 窗口标题
    glutDisplayFunc(Paint); // 执行场景绘制函数
    glutMainLoop(); // 开始循环执行 OpenGL 命令
}
T31

题目:请使用 OpenGL 和 GLUT 编写一个显示线框球体的简单图形程序。其中球体的半径为 0.8,经线数为 24,纬线数为 12,并绕 x 轴旋转 30 度,程序窗口的大小为(200, 200),标题为“线框球”

#include <GL/glu.h>
#include <GL/glut.h>

void Paint(){
    glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
    glLoadIdentity(); // 初始化矩阵
    glRotated(30, 1, 0, 0); // 旋转
    glutWireSphere(0.8, 24, 12); // 线框球(半径、经线、纬线)
    glFlush();
}

int main(int argc, char **argv){
    glutInit(&argc, argv); // 做题不写
    glutInitWindowSize(200, 200); // 程序窗口大小
    glutCreateWindow("线框球"); // 窗口标题
    glutDisplayFunc(Paint); // 执行场景绘制函数
    glutMainLoop(); // 开始循环执行 OpenGL 命令
}
T32

题目:请使用 OpenGL 和 GLUT 编写一个显示线框椭球体的简单图形程序。其中椭球体的两极方向为上下方向,左右方向的半径为 0.98,上下方向的半径为 0.49,前后方向的半径为 0.6,经线数为 48,纬线数为 24,使用正投影,裁剪窗口为(-1, -0.5)~(1, 0.5),程序窗口的大小为(400, 200),标题为“线框椭球”

#include <GL/glu.h>
#include <GL/glut.h>

void Paint(){
    glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
    glLoadIdentity(); // 初始化矩阵
    glRotated(-90, 1, 0, 0); // 两级为上下方向
    glScaled(0.98, 0.49, 0.6); // 缩放(左右、上下、前后)
    gluOrtho2D(-1, 1, -0.5, 0.5); // 裁剪窗口

    glutWireSphere(1, 48, 24); // 线框球(半径、经线、纬线)
    glFlush();
}

int main(int argc, char **argv){
    glutInit(&argc, argv); // 做题不写
    glutInitWindowSize(400, 200); // 程序窗口大小
    glutCreateWindow("线框椭球"); // 窗口标题
    glutDisplayFunc(Paint); // 执行场景绘制函数
    glutMainLoop(); // 开始循环执行 OpenGL 命令
}
T33

题目:请使用 OpenGL、GLU 和 GLUT 编写一个三维犹他茶壶程序。其中茶壶的半径为 1 单位,并远移 6.5 单位;观察体规定为:视场角=30 度,宽高比=1,近=1,远=100;程序窗口的大小为(200, 200),标题为“旋转的尤他茶壶”。茶壶绕 z 轴不断旋转,旋转的时间间隔为 25 毫秒,角度间隔为 2 度。注意旋转角度必须限定在 0~360 度以内。

#include <GL/glu.h>
#include <GL/glut.h>

int rot = 0; // 旋转角度

// 思路参考 P89
void Timer(int millis){
    rot = (rot + 2) % 360;
    glutPostRedisplay(); // 场景描绘函数
    glutTimerFunc(millis, Timer, millis); // (间隔毫秒数、函数名、参数值)
}

void Paint(){
    glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区

    glLoadIdentity(); // 初始化矩阵
    glRotatef(rot, 0, 0, 1); // 绕 z 轴旋转rot
    glColor3f(1, 1, 1);

    gluPerspective(30, 1, 1, 100); // 视角
    glTranslated(0, 0, -6.5); // 远移 6.5 单位
    glutWireTeapot(1); // 3D茶壶,半径为 1 单位
    glFlush();

}

int main(int argc, char **argv){
    glutInit(&argc, argv); // 做题不写
    glutInitWindowSize(200, 200); // 程序窗口大小
    glutCreateWindow("旋转的尤他茶壶"); // 窗口标题

    glutTimerFunc(25, Timer, 25);
    glutDisplayFunc(Paint); // 执行场景绘制函数
    glutMainLoop(); // 开始循环执行 OpenGL 命令
}
T35

题目:请使用 OpenGL、GLU 和 GLUT 编写一个简单的多视口演示程序。要求:在屏幕窗口左下角的 1/4 部分显示一个红色的填充正三角形;在屏幕窗口右上角的 1/4 部分显示一个绿色的填充正方形;三角形和正方形的左下角顶点坐标值均为(0, 0),右下角顶点坐标值均为(1, 0);裁剪窗口均为(-0.1, -0.1)~(1.1, 1.1);程序窗口的大小为(200, 200),标题为“多视口演示”

#include <GL/glu.h>
#include <GL/glut.h>

// 思路参考 P29
void Triangle(){
    glBegin(GL_TRIANGLES);
    glVertex2d(0, 0);
    glVertex2d(1, 0);
    glVertex2d(0.5, 0.8660);
    glEnd();
}

void Rectangle(){ // 矩形
    glRectf(0, 0, 1, 1); // 对角的坐标 (0,0) & (1, 1)
}

void Paint(){
    int w = glutGet(GLUT_WINDOW_WIDTH);
    int h = glutGet(GLUT_WINDOW_HEIGHT);
    glLoadIdentity(); // 初始化矩阵
    gluOrtho2D(-0.1, 1.1, -0.1, 1.1); // 裁剪窗口

    glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区

    glViewport(0, 0, w/2, h/2); // 左下
    glColor3f(1, 0, 0);
    Triangle();

    glViewport(w/2, h/2, w/2, h/2); // 右上
    glColor3f(0, 1, 0);
    Rectangle();

    glFlush();
}

int main(int argc, char **argv){
    glutInit(&argc, argv); // 做题不写
    glutInitWindowSize(200, 200); // 程序窗口大小
    glutCreateWindow("多视口演示"); // 窗口标题
    glutDisplayFunc(Paint); // 执行场景绘制函数
    glutMainLoop(); // 开始循环执行 OpenGL 命令
}

OpenCV

T35

请使用 OpenCV 编写一个简单的程序,用于从当前目录读入并显示一幅彩色图像(例如当前目录中的
lena.jpg)。

#include "iostream"
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

int main() {
    IplImage *im = cvLoadImage("075.jpg", 1); // 声明 IplImage 指针,载入彩色图像。0是灰色

    if(im == 0) return -1;

    cvShowImage("OpenCV_T35", im); // 显示图像

    while (cvWaitKey(0) != 27){} // 等待Esc

    cvReleaseImage(&im); // 释放图像
    cvDestroyWindow("OpenCV_T35"); // 销毁窗口
}
T36

请使用 OpenCV 编写一个简单的程序,用于从当前目录读入并显示一幅灰度图像(例如当前目录中的
lena.jpg)。

int main() {
    CvMat *mat = cvLoadImageM("075.jpg", 0); // 声明灰度图像
    
    if(mat == 0) return -1;
    
    cvShowImage("OpenCV_T36", mat); // 创建窗口显示图像
    
    while (cvWaitKey(0) != 27) {} // 等待Esc
    
    cvReleaseMat(&mat);
    cvDestroyAllWindows(); // 销毁所有窗口
}
T37

请使用 OpenCV 编写一个简单的程序,该程序首先读入一幅彩色图像(例如当前目录中的 lena.jpg),然
后将这幅彩色图像的 3 个通道分离出来,得到 3 幅灰度图像,最后显示这 3 幅灰度图像。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

int main() {
    IplImage *img = cvLoadImage("075.jpg", 1); // 载入彩色图像,参数为0载入的是灰色

    if(img == 0) return -1;

    IplImage *redImage = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
    IplImage *greenImage = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
    IplImage *blueImage = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);

    // OpenCV采用的色彩模式是 BGR
    cvSplit(img, blueImage, greenImage, redImage, 0);

    cvShowImage("main", img);
    cvShowImage("blue", blueImage);
    cvShowImage("green", greenImage);
    cvShowImage("red", redImage);

    while (cvWaitKey(0) != 27) {}

    cvReleaseImage(&img);
    cvReleaseImage(&redImage);
    cvReleaseImage(&greenImage);
    cvReleaseImage(&blueImage);
    cvDestroyAllWindows();
}
T38

请使用 OpenCV 编写一个简单的程序,该程序从 1 幅彩色图像(使用当前目录中的 lena.jpg)中分离出蓝
色通道,得到 1 幅灰度图像。要求显示源图像和结果图像。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

int main() {
    IplImage *img = cvLoadImage("075.jpg", 1); // 载入彩色图像

    if(img == 0) return -1;

    IplImage *blueImage = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);

    // OpenCV采用的色彩模式是BGR
    cvSplit(img, blueImage, 0, 0, 0);

    cvShowImage("main", img);
    cvShowImage("blue", blueImage);

    while (cvWaitKey(0) != 27) {}

    cvReleaseImage(&img);
    cvReleaseImage(&blueImage);
    cvDestroyAllWindows();
}
T39

请使用 OpenCV 编写一个简单的程序,该程序首先从一幅真彩色图像(使用当前目录中的 lena.jpg)中选
取一个矩形子集,并用蓝色填充该矩形子集,然后显示图像。其中矩形子集的起始位置为(64, 96),大小为(96, 48)。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

int main() {
    CvMat *img = cvLoadImageM("075.jpg", 1); // 载入彩色图像
    if(img == 0) return -1;
    CvRect R = {64, 69, 96, 48}; // 起始位置和大小
    CvMat head; // 结果矩阵头
    CvMat *Y = cvGetSubRect(img, &head, R); // 选取矩形子集
    cvSet(Y, CV_RGB(0, 0, 255), NULL); // 矩形子集改为 蓝色:CV_RGB(0, 0, 255)

    cvShowImage("main", img);
    while (cvWaitKey(0) != 27) {}
    cvReleaseMat(&img);
    cvDestroyAllWindows();
}
T40

使用 OpenCV 装入一幅大小至少为 512*512 的真彩色图像,并显示该图像(使用当前目录中的 lena.jpg)。
然后在源图像中指定一个矩形区域(左上顶点和宽高值分别为(128, 256)和(256, 128)的矩形),并在结果图像窗口中显示源图像中被选取的部分。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

int main() {
    CvMat *img = cvLoadImageM("075.jpg", 1); // 载入彩色图像
    if(img == 0) return -1;
    CvRect R = {128, 256, 256, 128}; // 起始位置和大小
    CvMat head; // 结果矩阵头
    CvMat *Y = cvGetSubRect(img, &head, R); // 选取矩形子集

    cvShowImage("main", Y);// 这里是显示 Y 区域
    while (cvWaitKey(0) != 27) {}
    cvReleaseMat(&img);
    cvDestroyAllWindows();
}
T41 -- 没太理解

使用 OpenCV 编写一个程序,该程序将一幅灰度图像(使用当前目录中的 lena.jpg)的灰度值线性地变换
到范围[0, 255]。要求分别显示源图像和结果图像。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

int main() {
    CvMat *X = cvLoadImageM("075.jpg", 0); // 载入灰度图像

    // 定义结果图像,与源图像大小相同的双精度矩阵
    CvMat *Y = cvCreateMat(X->rows, X->cols, CV_64F);
    cvScale(X, Y, 1, 0);   // Y(i) = 1 * X + 0 
    cvNormalize(Y, Y, 0, 255, CV_MINMAX, 0);

    cvShowImage("Main", X);
    cvShowImage("Scale", Y);

    while (cvWaitKey(0) != 27) {}

    cvReleaseMat(&X);
    cvReleaseMat(&Y);
    cvDestroyAllWindows();
}
T42

随机生成一幅浮点数灰度图像(大小和亮度都是随机的,大小值位于区间[128, 639]),然后将该图像变
换成亮度是 0~1 的浮点数图像,最后变换成字节图像并显示该图像。

一脸懵逼:opencv随机生成点图像

T46

使用 OpenCV 编写一个演示傅立叶变换和逆变换的程序。该程序首先装入一幅灰度图像并显示该图像(例
如当前目录中的 lena.jpg),然后对该图像进行傅立叶正变换,对得到的结果进行傅立叶逆变换,显示得到的结果以便与原图像进行比对。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

int main() {
    CvMat *X = cvLoadImageM("075.jpg", 0); // 载入灰度图像

    // 定义结果图像,与源图像大小相同的双精度矩阵
    CvMat *Y = cvCreateMat(X->rows, X->cols, CV_64F);
    cvScale(X, Y, (double)1 / 255, 0);

    cvDFT(Y, Y, CV_DXT_FORWARD, 0);
    cvDFT(Y, Y, CV_DXT_INVERSE_SCALE, 0);

    cvShowImage("Main", X);
    cvShowImage("Dst", Y);

    while (cvWaitKey(0) != 27) {}

    cvReleaseMat(&X);
    cvReleaseMat(&Y);
    cvDestroyAllWindows();
}
T49(复现课本,编译出错)

题目:使用 OpenCV 编写一个演示离散余弦变换和逆变换的程序。该程序首先装入一幅灰度图像并显示该图像(例如当前目录中的 lena.jpg),然后对该图像进行离散余弦正变换,对得到的结果进行离散余弦逆变换,显示得到的结果以便与原图像进行比对。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

int main() {
    CvMat *src = cvLoadImageM("075.jpg", 0); // 载入灰度图像

    CvMat *X = cvCreateMat(src->rows, src->cols, CV_64F);
    cvScale(src, X, (double)1/255, 0);

    cvDCT(X, X, CV_DXT_FORWARD);

    // 靠近原点的元素改为0
    for (int u = 0; u < src->cols; ++u)
        for (int v = 0; v < src->rows; ++v)
            cvmSet(src, v, u, 0);
    cvDCT(X, X, CV_DXT_INVERSE);

    cvShowImage("Source", src);
    cvShowImage("DCT", X);

    while (cvWaitKey(0) != 27) {}

    cvReleaseMat(&src);
    cvReleaseMat(&X);
    cvDestroyAllWindows();
}
T52、53、54

题目:使用 OpenCV 编写一个程序,该程序对一幅灰度图像(使用当前目录中的 lena-n.jpg)进行一次简单模糊、高斯模糊、中值模糊,要求分别显示源图像和结果图像。其中内核大小分别为 3×3、5x5、3x3。

注意,main函数第一行,和注释部分内核大小,请根据题意做出更改。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

int main() {
    CvMat *src = cvLoadImageM("075.jpg", 1); // 载入彩色图像,0表示灰色图像
    cvShowImage("Source", src);

    // 结果图像
    CvMat *X = cvCreateMat(src->rows, src->cols, src->type);

    cvSmooth(src, X, CV_BLUR, 3, 3, 0, 0); // 简单,3*3模板
    cvShowImage("CV_BLUR", X);

//    cvSmooth(src, X, CV_GAUSSIAN, 5, 5, 0, 0);// 高斯,5*5模板
//    cvShowImage("CV_GAUSSIAN", X);
//
//    cvSmooth(src, X, CV_MEDIAN, 3, 3, 0, 0); // 中值,3*3模板
//    cvShowImage("CV_MEDIAN", X);

    while (cvWaitKey(0) != 27) {}

    cvReleaseMat(&src);
    cvReleaseMat(&X);
    cvDestroyAllWindows();
}

效果图:效果图:
1562420178278.png
T55

题目:使用 OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的 lena.jpg)进行 Sobel 锐化,要求显示(T56:显示原图像和)锐化以后的图像。其中内核大小为 3×3,x 和 y 方向均使用 1 阶差分(T56:使用 1 阶 x 差分,T57:使用Laplace,3*3内核)。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

int main() {
    CvMat *src = cvLoadImageM("075.jpg", 0); // 载入图像
    if(src == 0)
        return -1;
    
    // cvShowImage("source", src); // T56
    CvMat *tmp = cvCreateMat(src->rows, src->cols, CV_32F);
    cvSobel(src, tmp, 1, 1, 3); // 使用Sober,x,y方向1阶差分,3*3内核
    // cvSobel(src, tmp, 1, 0, 3); // T56 使用Sober,x方向1阶差分,3*3内核
    // cvLaplace(src, tmp, 3); // T57,使用Laplace,3*3内核
    
    // 下三行也可直接 cvShowImage("Sober", tmp);
    CvMat *Y = cvCreateMat(src->rows, src->cols, CV_8U); // 字节图像
    cvConvert(tmp, Y); // 输出图像转化为字节图像
    cvShowImage("Sober", Y);

    while (cvWaitKey(0) != 27) {}

    cvReleaseMat(&Y);
    cvDestroyAllWindows();
}
T61

题目:使用 OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的 lena.jpg)进行直方图均衡化,要求分别显示源图像和均衡化以后的图像。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

int main() {
    CvMat *src = cvLoadImageM("075.jpg", 0); // 载入图像
    if(src == 0)
        return -1;
    cvShowImage("source", src);
    cvEqualizeHist(src, src); // 应用直方图均衡化
    cvShowImage("EqualizeHist Image", src);

    while (cvWaitKey(0) != 27) {}
    cvReleaseMat(&src);
    cvDestroyAllWindows();
}
T62

题目:使用 OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的 lena.jpg)进行二值化变换,要求分别显示源图像和二值化以后的图像。其中二值化阈值为 127,高亮度改为 255。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

int main() {
    CvMat *X= cvLoadImageM("075.jpg", 0); // 载入图像
    if(X == 0)
        return -1;
    cvShowImage("Source", X);
    cvThreshold(X, X, 127, 255, CV_THRESH_BINARY); // 二值化
    cvShowImage("阈值(127),高度(255)", X);

    while (cvWaitKey(0) != 27) {}
    cvReleaseMat(&X);
    cvDestroyAllWindows();
}
T63

题目:使用 OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的 lena.jpg)进行 Canny 边缘检测,要求分别显示源图像和检测到的边缘。其中小阈值为 50,大阈值为 150,内核大小为 3。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

int main() {
    CvMat *X= cvLoadImageM("075.jpg", 0); // 载入图像
    if(X == 0)
        return -1;
    cvShowImage("Source", X);

    cvCanny(X, X, 50, 3 * 50, 3);
    cvShowImage("Canny: 50, 3 * 50", X);

    while (cvWaitKey(0) != 27) {}
    cvReleaseMat(&X);
    cvDestroyAllWindows();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266