在原始图像最初的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