opencv (C语言) 系列一:各函数基本应用及图片反色

本期主要讲解各个基础函数的应用

数据类型: 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;
}

图像反色效果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/slandarer/article/details/111823806