c++ opencv

1、读取图片,灰度化等
命名空间使用cv::,使得opencv库与c++标准库区分开,养成良好的代码风格

#include<opencv2/opencv.hpp> //该头文件包含了opencv的所有函数
int main() {
 cv::Mat img = cv::imread("1.jpg"-1); //cv::Mat 表示opencv下的一种数据结构(矩阵类型的结构),这里表示img为一个图片矩阵
 //cv::Mat img=cv::imread("1.jpg",-1) //IMREAD_UNCHANGED(<0),小于0的数。表示加载原图
 //cv::Mat img=cv::imread("1.jpg",0) //IMREAD_GRAYSCALE(0),等于0的数。表示加载其灰度图
 //cv::Mat img=cv::imread("1.jpg",1) //IMREAD_COLOR(>0),大于0的数。表示加载RGB图
 if (img.empty()) return -1; //-1表示程序异常退出
 cv::namedWindow("1", cv::WINDOW_AUTOSIZE); //创建一个窗口开显示图片
 cv::imshow("1", img); //决定在哪个窗口显示哪幅图片,因为通常情况下不止一个窗口和一张图片
 cv::waitKey(0); //waitKey的参数大于0,则表示等待此数毫秒的时间;若小于等于0,则直到按下一个键才开始继续运行
 cv::destroyAllWindows();
 return 0;
}
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main() {
 Mat img = imread("C:\\Users\\Administrator.WIN-S21DVH7M0Q7\\Desktop\\op\\1.jpg");
 if (img.empty() == 1) {
  cout << "can get any input img" << endl;
  return -1;
 }
 namedWindow("img",WINDOW_AUTOSIZE);
 imshow("img", img);
 waitKey(0);
 Mat img1;
 cvtColor(img, img1, COLOR_RGB2GRAY); //cvtColor函数的返回值为void
 imshow("img1", img1);
 waitKey(0);
 destroyAllWindows();
 return 0;
}

2、访问每个像素:

#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void change1(Mat &img); //使用指针来操作像素点
void change2(Mat &img);//使用迭代器来操作像素点
int main() {
 Mat img = imread("C:\\Users\\Administrator.WIN-S21DVH7M0Q7\\Desktop\\op\\1.jpg", -1);
 //change1(img);
 change2(img);
 imshow("change_img", img);
 waitKey(0);
 destroyAllWindows();
 return 0;
}
void change1(Mat &img) { //参数为引用,这样可以改变原图片
 int rows = img.rows; //不是rows()
 int cols = img.cols;
 int chan = img.channels();
 //遍历像素点
 for (int row = 0; row < rows; row++) {
  uchar* ptr_img = img.ptr <uchar>(row); //定义一个uchar型指针,img.ptr<uchar>(row)[colum]
  for (int col = 0; col < cols * chan; col++) {
   //由于img.ptr<uchar>(row)为指向row行的指针。
   //指针相当于数组名,可以通过数组ptr_img[n]来操作此行所有列与通道的元素
   ptr_img[col] = 255; //将所有像素点变成白色 ;img.ptr<uchar>(row)[colum]
  }
 }
}
void change2(Mat& img) {
 MatIterator_ < Vec3f > p= img.begin< Vec3f >(); //begin后面必须加< Vec3f >
 //< Vec3f >代表每个像素点的三通道
 MatIterator_ < Vec3f > p1 = img.end<Vec3f>();
 while(p != p1) {
  (*p)[0] = 255; //p必须加括号,*p表示一个三元素的数组
  //(*p)[1] = 255;
  (*p)[2] = 255;
  p++;
 }
}

3、

for ( int i=0; i<rows; i++ )
{
    for ( int j=0; j<cols; j++ )
    {
         image.at<uchar>(i, j)= 0; // also can be: image.at<uchar>( cv::Point(j, i) ) = 0;
         /*
             if color one:
             image.at<uchar>( i, j*3 + 0 ) = 0;
             image.at<uchar>( i, j*3 + 1 ) = 0;
             image.at<uchar>( i, j*3 + 2 ) = 0;
         */
    }
}

三通道图片之所以,这样遍历:( i, j*3 + 0 ),与图片的内存结构有关
在这里插入图片描述
待续。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值