Emgu 学习(4) 使用指针访问图像内存

在原始图像最初的10行绘制一个颜色条

   class Program
    {
        static void Main(String[] args)
        {
            Mat img = CvInvoke.Imread(@"C:UsersdellPicturesmach.jpg");

            CvInvoke.Imshow("draw", img);
            Mat dst = img.Clone();
            int row = img.Rows;
            int col = img.Cols * img.NumberOfChannels;
            Console.WriteLine("DepthType is " + dst.Depth+"and elementSize is"+dst.ElementSize);

            for (int i = 0; i < 20; i++)
                for (int j = 0; j < img.Cols;j++)
                {
                    SetAtB(dst, i, j, 0);
                    SetAtG(dst, i, j, 255);
                    SetAtR(dst, i, j, 0);

                }

            CvInvoke.Imshow("hello", dst);
                    CvInvoke.WaitKey(0);
            

        }
        private static IntPtr GetAt(Mat mat,int row,int col)
        {
            return mat.DataPointer + (row * mat.Cols + col) * mat.ElementSize;
        }
        private static void SetAtB(Mat mat, int row, int col, byte value)
        {
            Marshal.Copy(new byte[] { value }, 0, GetAt(mat, row, col), 1);
        }
        private static void SetAtG(Mat mat, int row, int col, byte value)
        {
            Marshal.Copy(new byte[] { value }, 0, GetAt(mat, row, col)+1, 1);
        }
        private static void SetAtR(Mat mat, int row, int col, byte value)
        {
            Marshal.Copy(new byte[] { value }, 0, GetAt(mat, row, col)+2, 1);
        }
    }

类似要求C++的两种处理方法

方法1

#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;

void main(){
    //动态地址访问
    Mat img=imread("E://green.png");
    imshow("src",img);
    Mat dst=img.clone();
    int rowNumber=img.rows;//获取行数
    int colNumber=img.cols;//获取列数
    for(int i=0;i<rowNumber;i++){
        for (int j = 0; j <colNumber; j++)
        {
            dst.at<Vec3b>(i,j)[0]=255;//蓝色通道
            dst.at<Vec3b>(i,j)[1]=0;//绿色通道
            dst.at<Vec3b>(i,j)[2]=0;//红色通道
            //dst.at<uchar>(i,j)=255;//灰度图像
        }
    }
    imshow("dst",dst);
    waitKey(0);
}

方法2:

#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;

void main(){
        Mat img=imread("E://green.png");
    imshow("src",img);
    Mat dst=img.clone();
    int rowNumber=img.rows;//获取行数
    int colNumber=img.cols*img.channels();//列数×通道数=每一行的元素个数
    for(int i=0;i<rowNumber;i++){
        uchar* data=dst.ptr<uchar>(i);//获取每一行首地址,ptr函数可以得到图像任意行的首地址
        for (int j = 0; j <colNumber; j++)
        {
            //data[j]=255;//灰度图
            switch (j%3)
            {
            case 0://蓝色通道
                data[j]=255;
                break;
            case 1://绿色通道
                data[j]=0;
                break;
            case 2://红色通道
                data[j]=255;
                break;
            }
        }
    }
    imshow("dst",dst);
    waitKey(0);    
}

另外一种方法https://stackoverflow.com/questions/32255440/how-can-i-get-and-set-pixel-values-of-an-emgucv-mat-image

原文地址:https://www.cnblogs.com/noigel/p/10929209.html