C++opencv-像素操作


在Windows下,RGB存儲的順序為BGR

方法一

#include <opencv2/opencv.hpp> 

int main()
{
    
    cv::Mat img = cv::imread("./tu/馬.jpg", cv::IMREAD_UNCHANGED); 

    size_t rr=200, c=100;//rr 行號,c 列號
    cv::Vec3b& bgr = img.at<cv::Vec3b>(rr, c); //返回指定行列的像素
    /*
    圖像類型:
            cv::Vec3b        三通道彩色(8位)
            unsigned char    單通道灰度
            unsigned short   16位灰度
            float            32位浮點型
            cv::Vec2f        雙通道32位
    */

    int b = int(bgr[0]);//提取B通道的數據 //bgr[0] 的數據類型是unsigned char

    //bgr[0]=0; //修改B通道的數據
    int g = int(bgr[1]); //提取G通道的數據
    int r = int(bgr[2]); //提取R通道的數據

    std::cout << typeid(bgr[0]).name() << b << "," << g << "," << r << std::endl;
        
}

 

方法二:指針法

#include <opencv2/opencv.hpp> 

int main()
{
    
    cv::Mat img = cv::imread("./tu/馬.jpg", cv::IMREAD_UNCHANGED); 

    size_t r=200, c=100;//rr 行號,c 列號
    
    int x = img.step[0];//返回圖像一行的字節數 //x=圖像的寬*通道數
 unsigned char* pRow = img.data + r * img.step[0];//計算圖像指定行行首指針 //r  行號
    //img.data 返回圖像的首地址
    unsigned char rr;
    rr = pRow[3 * c + 2]; //返回r行c列像素的R通道的數據
    x = int(rr);
    //pRow[3 * c + 2]=0; //修改r行c列像素的R通道的數據
    std::cout << x<< std::endl;
        
}

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM