本期主要讲解各个基础函数的应用
数据类型: IplImage *
所用软件: Visual Studio 2017
头文件:
#include<cv.h>
#include<cxcore.h>
#include<highgui.h>
对于需要数学运算的:
#include<math.h>
基本函数介绍:
图片路径:
假设图片在如下位置时,可使用路径:
const char *filename = "test.bmp";
否则使用绝对路径(例如在桌面):
const char *filename = "C:\\Users\\Lenovo\\Desktop\\test.bmp";
需要注意的是,绝对路径需要使用双斜杠
图片读取:
读取图片并命名为inputimage,若想读取黑白单通道图片,则可将 -1 改为 0 ;
IplImage *inputimage = cvLoadImage(filename, -1);
窗口创建:
创建名为input的窗口,若想自由改变窗口大小,则将 1 改为0:
cvNamedWindow("input", 1);
图片展示:
在名为input的窗口中展示图片inputimage:
cvShowImage("input", inputimage);
图像展示时间:
括号内数字小于等于0,保持窗口一直不关闭,数字大于0时,括号内数字即为保持不关闭的时长:
cvWaitKey(0);
窗口销毁:
cvDestroyWindow("inputimage");
如需大量销毁则可使用:
cvDestroyAllWindows();
图像内存释放:
cvReleaseImage(&inputimage);
空白图像创建:
虽说是空白图像,创建出来的默认是灰色
例:创建与inputimage大小相同图像
IplImage *newimage = cvCreateImage(cvSize(inputimage->width, inputimage->height), IPL_DEPTH_8U, inputimage->nChannels);
其中IPL_DEPTH_8U表明各通道数值范围为0-255,这是我们使用的最多的范围
各属性介绍:
->nChannels:通道数,大部分彩色图片都是三通道的,需要注意的是大部分软件使用RGB通道,而opencv使用BGR通道,三通道的数值代表B(blue),G(green),R(red)颜色的强度
->width
->height:
图像使用像素点显示,width表示横向像一行素点个数,height表示纵向一列像素点个数。
->widthStep:
一行实际存储数据个数,如图所示实际图像是按如下方式存储数据,widthStep=width*nChannels
->imageData:
实际数据存储矩阵,使用方式:
例(将第i行,第j列像素点第k通道颜色设为255)
inputimahe->imageData[i*inputimage->widthStep + j * inputimage->nChannels + k]=(unsigned char)255;
注由于数据存储的格式问题,赋值及数值提取最好都将数据转化为unsigned char格式
图像反色完整代码:
为保证格式,将代码分写为三个文件:
inverseImage.h
#pragma once
#include<cv.h>
#include<highgui.h>
#include<cxcore.h>
IplImage *inverseImage(IplImage *inputimage);
inverseImage.cpp
#include"inverseImage.h"
IplImage *inverseImage(IplImage *inputimage) {
IplImage *inverseimage = cvCreateImage(cvSize(inputimage->width, inputimage->height), IPL_DEPTH_8U, inputimage->nChannels);
for (int i = 0; i < inputimage->height; i++) {
for (int j = 0; j < inputimage->width; j++) {
for (int k = 0; k < inputimage->nChannels; k++) {
inverseimage->imageData[i*inputimage->widthStep + j * inputimage->nChannels + k] =
255 - (unsigned char)inputimage->imageData[i*inputimage->widthStep + j * inputimage->nChannels + k];
}
}
}
return inverseimage;
}
main.cpp
#include"inverseImage.h"
int main() {
const char *filename = "test.bmp";
IplImage *inputimage = cvLoadImage(filename, -1);
IplImage *inverseimage;
inverseimage = inverseImage(inputimage);
cvNamedWindow("inverse", 1);
cvShowImage("inverse", inverseimage);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&inputimage);
cvReleaseImage(&inverseimage);
return 0;
}
图像反色效果: