目录
测试图片
world.png
rgb->gray
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
cv::Mat img = imread("./world.png");
cout << img.rows << ", " << img.cols << ", " << img.channels() << endl;
cv::imshow("rgb-img", img);
cv::waitKey(10000);
Mat grayImg;
cvtColor(img,grayImg,COLOR_BGR2GRAY);
imshow("gray-img", grayImg);
waitKey(10000);
}
左右翻转
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("./world.png");
Mat flipImg;
cv::flip(img,flipImg, 1);
cv::imshow("rgb-img", img);
cv::waitKey(10000);
cv::destroyAllWindows();
imshow("flip-img", flipImg);
waitKey(10000);
destroyAllWindows();
}
上下翻转
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("./world.png");
Mat flipImg;
cv::flip(img,flipImg, 0);
cv::imshow("rgb-img", img);
cv::waitKey(10000);
cv::destroyAllWindows();
imshow("flip-img", flipImg);
waitKey(10000);
destroyAllWindows();
}
resize
自定义宽高
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("./world.png");
Mat resizeImg;
cv::resize(img,resizeImg,cv::Size(500,800));
cv::imshow("rgb-img", img);
cv::waitKey(10000);
cv::destroyAllWindows();
imshow("resize-img", resizeImg);
waitKey(10000);
destroyAllWindows();
}
比例放缩
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("./world.png");
Mat resizeImg;
cv::resize(img,resizeImg,cv::Size(img.cols/2,img.rows/2));
cv::imshow("rgb-img", img);
cv::waitKey(10000);
cv::destroyAllWindows();
imshow("resize-img", resizeImg);
waitKey(10000);
destroyAllWindows();
}
保存图片
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("./world.png");
Mat resizeImg;
cv::resize(img,resizeImg,cv::Size(img.cols/2,img.rows/2));
cv::imwrite("./world_resize.jpg", resizeImg);
}
生成图片
data方式
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat diyImg(100,200,CV_8UC3);
int index;
for (int i=0; i<diyImg.rows; i++)
{
for (int j=0; j<diyImg.cols; j++)
{
index = i*diyImg.cols + j;
diyImg.data[3*index+0] = 0;
diyImg.data[3*index+1] = 0;
diyImg.data[3*index+2] = 255;
}
}
imshow("diy-img", diyImg);
waitKey(10000);
destroyAllWindows();
imwrite("world_diy.jpg", diyImg);
}
at方式
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat diyImg(100,200,CV_8UC3);
for (int i=0; i<diyImg.rows; i++)
{
for (int j=0; j<diyImg.cols; j++)
{
diyImg.at<Vec3b>(i,j)[0] = 255;
diyImg.at<Vec3b>(i,j)[1] = 0;
diyImg.at<Vec3b>(i,j)[2] = 0;
}
}
imshow("diy-img", diyImg);
waitKey(10000);
destroyAllWindows();
imwrite("world_diy.jpg", diyImg);
}
裁剪图片
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("./world.png");
int l_x=300,l_y=200,r_x=1900,r_y=500;
int w = r_x - l_x;
int h = r_y - l_y;
Mat cropImg(h,w,CV_8UC3);
for (int i=0; i<img.rows; i++)
{
if (i>=l_y && i<r_y)
{
for (int j=0; j<img.cols; j++)
{
if (j>=l_x && j<r_x)
{
cropImg.at<Vec3b>(i-l_y,j-l_x)[0] = img.at<Vec3b>(i,j)[0];
cropImg.at<Vec3b>(i-l_y,j-l_x)[1] = img.at<Vec3b>(i,j)[1];
cropImg.at<Vec3b>(i-l_y,j-l_x)[2] = img.at<Vec3b>(i,j)[2];
}
}
}
}
imshow("crop-img", cropImg);
waitKey(10000);
destroyAllWindows();
imwrite("world_crop.jpg", cropImg);
}
画矩形框
调opencv函数
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("./world.png");
int l_x=300,l_y=200,r_x=1900,r_y=500;
rectangle(img,cv::Point(l_x,l_y),cv::Point(r_x,r_y),cv::Scalar(0,0,255));
imshow("box-img", img);
waitKey(10000);
destroyAllWindows();
imwrite("world_box.jpg", img);
}
自己实现函数
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
cv::Mat plotbox(cv::Mat img,int l_x,int l_y,int r_x,int r_y)
{
// 画2条横线
for (int x=l_x; x<r_x; x++)
{
img.at<Vec3b>(l_y,x)[0] = 0;
img.at<Vec3b>(l_y,x)[1] = 0;
img.at<Vec3b>(l_y,x)[2] = 255;
img.at<Vec3b>(r_y,x)[0] = 0;
img.at<Vec3b>(r_y,x)[1] = 0;
img.at<Vec3b>(r_y,x)[2] = 255;
}
// 画2条竖线
for (int y=l_y; y<r_y; y++)
{
img.at<Vec3b>(y,l_x)[0] = 0;
img.at<Vec3b>(y,l_x)[1] = 0;
img.at<Vec3b>(y,l_x)[2] = 255;
img.at<Vec3b>(y,r_x)[0] = 0;
img.at<Vec3b>(y,r_x)[1] = 0;
img.at<Vec3b>(y,r_x)[2] = 255;
}
return img;
}
int main()
{
Mat img = imread("./world.png");
int l_x=300,l_y=200,r_x=1900,r_y=500;
Mat boxImg = plotbox(img,l_x,l_y,r_x,r_y);
imshow("img", img);
waitKey(10000);
destroyAllWindows();
imshow("box_img", boxImg);
waitKey(10000);
destroyAllWindows();
imwrite("world_box.jpg", boxImg);
}
发现img也有框
自己实现的plotbox函数,可以不用返回画框后的图片,如下
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void plotbox(cv::Mat img,int l_x,int l_y,int r_x,int r_y)
{
// 画2条横线
for (int x=l_x; x<r_x; x++)
{
img.at<Vec3b>(l_y,x)[0] = 0;
img.at<Vec3b>(l_y,x)[1] = 0;
img.at<Vec3b>(l_y,x)[2] = 255;
img.at<Vec3b>(r_y,x)[0] = 0;
img.at<Vec3b>(r_y,x)[1] = 0;
img.at<Vec3b>(r_y,x)[2] = 255;
}
// 画2条竖线
for (int y=l_y; y<r_y; y++)
{
img.at<Vec3b>(y,l_x)[0] = 0;
img.at<Vec3b>(y,l_x)[1] = 0;
img.at<Vec3b>(y,l_x)[2] = 255;
img.at<Vec3b>(y,r_x)[0] = 0;
img.at<Vec3b>(y,r_x)[1] = 0;
img.at<Vec3b>(y,r_x)[2] = 255;
}
}
int main()
{
Mat img = imread("./world.png");
int l_x=300,l_y=200,r_x=1900,r_y=500;
plotbox(img,l_x,l_y,r_x,r_y);
imshow("img", img);
waitKey(10000);
destroyAllWindows();
imwrite("world_box.jpg", img);
}
显示文字
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void plotbox(cv::Mat img,int l_x,int l_y,int r_x,int r_y)
{
// 画2条横线
for (int x=l_x; x<r_x; x++)
{
img.at<Vec3b>(l_y,x)[0] = 0;
img.at<Vec3b>(l_y,x)[1] = 0;
img.at<Vec3b>(l_y,x)[2] = 255;
img.at<Vec3b>(r_y,x)[0] = 0;
img.at<Vec3b>(r_y,x)[1] = 0;
img.at<Vec3b>(r_y,x)[2] = 255;
}
// 画2条竖线
for (int y=l_y; y<r_y; y++)
{
img.at<Vec3b>(y,l_x)[0] = 0;
img.at<Vec3b>(y,l_x)[1] = 0;
img.at<Vec3b>(y,l_x)[2] = 255;
img.at<Vec3b>(y,r_x)[0] = 0;
img.at<Vec3b>(y,r_x)[1] = 0;
img.at<Vec3b>(y,r_x)[2] = 255;
}
}
int main()
{
Mat img = imread("./world.png");
int l_x=300,l_y=200,r_x=1900,r_y=500;
plotbox(img,l_x,l_y,r_x,r_y);
string text = "score: 0.9";
cv::Point p(l_x,l_y);
int font_style = cv::FONT_HERSHEY_COMPLEX;
double font_scale = 2;
cv::Scalar color(0,0,255);
int thickness = 2;
cv::putText(img,text,p,font_style,font_scale,color,thickness);
imshow("img", img);
waitKey(10000);
destroyAllWindows();
imwrite("world_text.jpg", img);
}
参考
-
各种操作:https://blog.csdn.net/starvapour/article/details/122071018
-
遍历像素值:https://blog.csdn.net/qq_27278957/article/details/84646948
-
画框:https://blog.csdn.net/wfei101/article/details/82695258