• 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

  • 相关阅读:
    9个数中取最大值最小值速度问题
    ubuntu 12.04安装git 1.8.11
    <转>Win7资源管理器更新后不断重启解决方案
    windows下安装安卓开发环境和NDK支持
    饱和算法
    bzip21.0.6
    《转》GetFileTitle与文件扩展名是否显示有关
    Ubuntu设置环境变量PATH的三种方法 <转>
    ubuntu下使用脚本交叉编译windows下使用的ffmpeg
    UnxUtils windows下linux命令
  • 原文地址:https://www.cnblogs.com/noigel/p/10929209.html
Copyright © 2020-2023  润新知