在/home下面创建了一个叫opencv的文件夹,在文件夹中创建三个目录 images、out、src 分别用来存放 需要处理和保存的图像,编译输出的可执行文件,工程源码。
进入src目录中,创建两个目录 include、source,和CMakeLists.txt 文件。其中source用来存放程序的源文件,include用于存放头文件。
使用VScode打开opencv文件夹
在source目录中创建 main.cpp 文件 ColChange.cpp 文件,在include目录中创建 ColChange.h文件。个文件的源码如下:
main.cpp
#include
#include
#include "ColChange.h"
//using namespace cv;
using namespace std;
int main(int argc, char** argv )
{
//读取图片,将图片存为Mat类的image实例中
Mat image = imread("../images/123.jpg");
if(image.empty()){
printf("could not load image...\n");
return -1;
}
//实例化一个QuickDemo
QuickDemo qd;
//qd.colorSpace_Demo(image);
//qd.mat_creat_demo(image);
qd.pixel_visit_demo(image);
//创建窗口SSJ
//cv::namedWindow("SSJ",WINDOW_FREERATIO);
//在SSJ窗口上,显示图片
//cv::imshow("SSJ", image);
//显示状态阻塞
cv::waitKey(0);
return 0;
}
ColChange.cpp
#include "ColChange.h"
/*
* Author:SSJ-xiaoguoke
* Funtion:转换图像的色彩空间,transform the color space of the image
*/
void QuickDemo::colorSpace_Demo(Mat &image)
{
Mat gray,hsv;
cvtColor(image,hsv,COLOR_BGR2HSV);
cvtColor(image, gray,COLOR_BGR2GRAY);
imshow("HSV",hsv);
imshow("huidu",gray);
imwrite("../images/hsv.jpg",hsv);
imwrite("../images/gray.jpg",gray);
}
/*
* Author:SSJ-xiaoguoke
* Funtion:创建Mat对象,Creating an image object
*/
void QuickDemo::mat_creat_demo(Mat &image)
{
Mat m1,m2;
m1 = image.clone();
image.copyTo(m2);
/*
* Size(8,8):创建的矩阵尺寸为 8*8
* CV_8UC1:8位 U:无符号unsigned C:char型 1:单通道
*/
//Mat m3 = Mat::zeros(Size(8,8),CV_8UC1);
/*三通道*/
Mat m3 = Mat::zeros(Size(500,500),CV_8UC3);
/*创建一个值全是1的矩阵*/
//Mat m3 = Mat::ones(Size(8,8),CV_8UC1);
m3 = Scalar(0,0,255);
//std::cout << m3 << std::endl;
imshow("red",m3);
}
/*
* Author:SSJ-xiaoguoke
* Funtion:像素操作,Pixel operations
*/
void QuickDemo::pixel_visit_demo(Mat &image)
{
int W = image.cols;
int h = image.rows;
int dims = image.channels();
/*for(int row=0; row < h; row++){
for(int col=0; col(row,col);
image.at(row,col) = 255 - pv;
}
if(dims==3){
Vec3b bgr = image.at(row,col);
image.at(row,col)[0] = 255 - bgr[0];
image.at(row,col)[1] = 255 - bgr[1];
image.at(row,col)[2] = 255 - bgr[2];
}
}
}*/
/*通过指针的方法实现*/
for(int row=0;row < h; row++){
uchar* current_row = image.ptr(row);
for(int col=0;col < W;col++){
if(dims==1){
int pv = *current_row;
*current_row++ = 255-pv;
}
if(dims==3){
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
}
}
}
imshow("Pixel operations",image);
}
ColChange.h
#include
using namespace cv;
using namespace std;
class QuickDemo {
public:
void colorSpace_Demo(Mat &image);
void mat_creat_demo(Mat &image);
void pixel_visit_demo(Mat &image);
};
CMakeLists.txt
#可执行文件名
project(test)
#设置可执行程序的输出路径
set(EXECUTABLE_OUTPUT_PATH ../out/)
#设置源码路径
set(SOURCES
./source/main.cpp
./source/ColChange.cpp
)
#添加头文件搜索路径
include_directories(./include)
#查找包
find_package(OpenCV 3 REQUIRED )
#添加编译的可执行文件
add_executable(test ${SOURCES})
#链接可执行文件
target_link_libraries(test ${OpenCV_LIBS})
代码编写完成之后,进入src目录中,执行指令编译工程
cmake ./
make
编译完成之后会在out目录下输出一个叫 test的可执行文件。在image下面放一张图片 改名为123.jpg(可以修改代码来修改加载的图片名字)
进入out目录
./test
cv::imread("../images/123.jpg");
cv::imshow("窗口名字",mat);
/*par1:保存的路径
*par2: 要保存的Mat对象
*/
cv::imwrite("../images/tom.jpg",tom);
/*将image的色彩空间装换成HSV,并将转换后的图像存在tom中*/
cvtColor(image, tom,COLOR_BGR2HSV);
图像的克隆,复制 以及 赋值操作。克隆和复制创建了新的数据,赋值与被赋值者公用同一段data,修改其中一个另一个也会改变。
Mat m1,m2,m3;
m1 = image.clone();
image.copyTo(m2);
m3 = image;
创建Mat对象,以及赋值
/*
* Size(8,8):创建的矩阵尺寸为 8*8
* CV_8UC1:8位 U:无符号unsigned C:char型 1:单通道
*/
Mat m3 = Mat::zeros(Size(500,500),CV_8UC3);
m3 = Scalar(0,0,255); //bgr, red通道拉满 其他通道为0 所以是一个纯红图片
/*坐标法*/
int pv = image.at(row,col);
image.at(row,col) = 255 - pv;
/*指针法*/
uchar* current_row = image.ptr(row);
for(int col=0;col < W;col++){
if(dims==1){
int pv = *current_row;
*current_row++ = 255-pv;
}
if(dims==3){
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
}
/*模板函数声明*/
template void ColorSpace_Demo(Mat &image,T cs);
/*模板函数定义*/
template
void ColorSpace_Demo(Mat &image, T cs)
{
Mat tom;
cvtColor(image, tom,cs);
imshow("Tom",tom);
imwrite("../images/tom.jpg",tom);
}
/模板函数的使用/
ColorSpace_Demo(image,40);
/*类中模板函数的声明*/
class QuickDemo {
public:
template void ColorSpace_Demo(Mat &image,T cs);
void mat_creat_demo(Mat &image);
};
/*类中模板函数的定义*/
template void QuickDemo::ColorSpace_Demo(Mat &image, T cs)
{
Mat tom;
cvtColor(image, tom,cs);
imshow("Tom",tom);
imwrite("../images/tom.jpg",tom);
}
**/*类中模板函数的使用*/**
QuickDemo qd;
qd.ColorSpace_Demo(image,40);
/*模板类函数的声明*/
template
class QuickDemo {
public:
void ColorSpace_Demo(Mat &image,T cs);
};
/*模板类函数的定义*/
template
void QuickDemo::ColorSpace_Demo(Mat &image, T cs)
{
Mat tom;
cvtColor(image, tom,cs);
imshow("Tom",tom);
imwrite("../images/tom.jpg",tom);
}
/*模板类函数的使用*/
QuickDemo qd;
qd.ColorSpace_Demo(image,40);