最近在复习opencv,整理一下基础知识。今天把Core组件的相关操作记录下来,常用的操作有以下几个:
Mat结构体
访问像素
Matimage;
Uchar*data = image.ptr<uchar>(i);
Mat_<Vec3b>::iteratorit = image.begin<Vec3b>();
(*it)[0];
Image.at<Vec3b>(i,j)[0];
图像叠加、混合
Matimage;
Image= iamge(Rect(500,250,logo.cols,log.rows));
Image= image(Range(250,250+logoimage.rows), Range(250,250+logoimage.cols));
logoImage.copyTo(image,mask);
addWeighted();
通道分离、合并
Spilt();
Merge();
对比度、亮度调节
下面记录一个VS下面的例子,方便以后利用、查看。
#include<iostream>
#include "classify.h"
#include<math.h>
#define max(a,b) a>b?a:b
using namespace std;
#define WINDOW_NAME "融合"
int g_nAl = 0;
void on_Trackbar(int a, void* c) //添加进度条
{
cv::Mat image1 = cv::imread("D:\\OpenCVprivate\\4.jpg");
cv::resize(image1, image1, cv::Size(720, 1280), 0.0, 0.0, CV_INTER_NN);
cv::Mat imageResult;
cv::Mat image2 = cv::Mat::zeros(image1.size(), image1.type());
try
{
addWeighted(image1, g_nAl / 100.0, image2, 1 - g_nAl / 100.0, 20.0, imageResult);
}
catch (...)
{
}
cv::imshow("WINDOW_NAME", imageResult);
cv::waitKey(10);
}
void imageAdd()//图像融合
{
cv::Mat image1 = cv::imread("D:\\OpenCVprivate\\3.jpg");
cv::Mat image2 = cv::imread("D:\\OpenCVprivate\\5.jpg");
cv::Mat image3 = cv::imread("D:\\OpenCVprivate\\4.jpg");
cv::resize(image1, image1, cv::Size(869, 1200), 0.0, 0.0, CV_INTER_NN);
cv::resize(image2, image2, cv::Size(300, 250), 0.0, 0.0, CV_INTER_NN);
cv::resize(image3, image3, cv::Size(869, 1200), 0.0, 0.0, CV_INTER_NN);
cv::Mat image4 = image1(cv::Rect(500, 300, image2.cols, image2.rows));
image2 = cv::min(image4, image2);
image2.copyTo(image4, cv::Mat());
cv::imshow("result", image1);
addWeighted(image1, 0.5, image3, 0.5, 0.0, image1);
cv::imshow("图像融合", image1);
cv::waitKey();
}
void splitMerge()//通道分离、合并
{
cv::Mat image1 = cv::imread("D:\\OpenCVprivate\\7.jpg");
cv::Mat image2 = cv::imread("D:\\OpenCVprivate\\11.jpg");
cv::Mat image3 = cv::imread("D:\\OpenCVprivate\\12.jpg");
cv::resize(image2, image2, cv::Size(869, 1200), 0.0, 0.0, CV_INTER_NN);
cv::resize(image1, image1, cv::Size(869, 1200), 0.0, 0.0, CV_INTER_NN);
cv::resize(image3, image3, cv::Size(869, 1200), 0.0, 0.0, CV_INTER_NN);
cv::Mat image4;
cv::Mat spilt1[3];
cv::Mat spilt2[3];
cv::Mat spilt3[3];
split(image1, spilt1);
split(image2, spilt2);
split(image3, spilt3);
spilt1[2] = spilt1[2];
spilt1[2] = spilt3[2];
merge(spilt1, 3, image4);
cv::imshow("分离、合并", image4);
cv::waitKey();
}
void brightnessContrast(int value, int value2) //亮度对比度调节
{
cv::Mat image = cv::imread("D:\\OpenCVprivate\\3.jpg");
image.rowRange(0, 10).setTo(cv::Scalar(0));
image.colRange(image.cols - 10, image.cols).setTo(cv::Scalar(0));
image.colRange(0, 10).setTo(cv::Scalar(0));
image.rowRange(image.rows - 10, image.rows).setTo(cv::Scalar(0));
for (int y = 10; y < image.rows - 10; y++)
for (int x = 10; x < image.cols - 10; x++)
for (int c = 0; c < image.channels(); c++)
{
image.at<cv::Vec3b>(y, x)[c] = MIN((value*0.01)*(image.at<cv::Vec3b>(y, x)[c] + value2), 255);
image.at<cv::Vec3b>(y, x)[c] = MAX(image.at<cv::Vec3b>(y, x)[c], 0);
}
cv::imshow("亮度对比度", image);
cv::waitKey();
}
int main()
{
imageAdd();
splitMerge();
brightnessContrast(120,0);//修改图像对比度(120%),亮度(+0)
g_nAl = 70;
double g_nMax = 100;
cv::namedWindow(WINDOW_NAME,1);
cv::createTrackbar("name:",WINDOW_NAME,&g_nAl,g_nMax,on_Trackbar);
cv::waitKey();
return 0;
}
正常运行是没问题,知识没有整理,看起来会有些不舒服。好在代码不多,有时间在整理吧