opencv Mat对象初始化、图像像素读取(1)

8 篇文章 0 订阅

1、Mat对象初始化

#include<opencv2/opencv.hpp>
    #include<iostream>
    using namespace std;
    using namespace cv;
    int main()
    {
    	Mat srcImg = imread("C:/Users/admin/Desktop/1.JPG");
    	if (!srcImg.data)
    	{
    		printf("未找到图像");
    		return -1;
    	}
    	namedWindow("srcImage Window", CV_WINDOW_AUTOSIZE);
    	imshow("srcImage Window", srcImg);
    	Mat csrc;
    	Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    	filter2D(srcImg, csrc, -1, kernel);
	
namedWindow("csrcImage Window", CV_WINDOW_AUTOSIZE);
imshow("csrcImage Window", csrc);
/*Mat dst;
dst=Mat(srcImg.size(), srcImg.type());//大小、类型
dst = Scalar(127, 0, 255);//3个通道*/
//Mat dst = srcImg.clone();//完全copy
Mat dst;
//srcImg.copyTo(dst);

cvtColor(srcImg, dst, CV_BGR2GRAY);

printf("dst通道数:%d\n",dst.channels());
printf("srcImg通道数:%d", srcImg.channels());

int cols = dst.cols;//列
int rows = dst.rows;//行
int channels = dst.channels();//通道数

const uchar* pFirstRow = dst.ptr<uchar>(0);

printf("first image value:%d", *pFirstRow);

//定义一个3*3像素集合 8bit uc:uchar  3:3通道  BGR:(0,0,255)红色 Scalar 向量长度与通道数一致
Mat M(3, 3, CV_8UC3, Scalar(0, 0, 255));//作用:验证算法正确性
//cout << "M=" << endl << M << endl;
//创建Mat对象2
Mat M1;
M1.create(srcImg.size(), srcImg.type());
M1 = Scalar(0,0,255);

Mat m2 = Mat::zeros(srcImg.size(), srcImg.type());//与输出图像大小一致,
Mat m3 = Mat::zeros(2, 2, CV_8UC1);//
Mat m4 = Mat::eye(2, 2, CV_8UC1);
waitKey(0);

}

2、图像像素读写

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace std;
using namespace cv;
int main()
{
	Mat dst_gray;
	Mat srcImg = imread("C:/Users/admin/Desktop/1.JPG");
	if (!srcImg.data)
	{
		printf("未找到图像");
		return -1;
	}
	namedWindow("srcImage Window", CV_WINDOW_AUTOSIZE);
	imshow("srcImage Window", srcImg);
	
cvtColor(srcImg, dst_gray, CV_BGR2GRAY);
namedWindow("dst_grayImage Window", CV_WINDOW_AUTOSIZE);
imshow("dst_grayImage Window", dst_gray);
int hight = dst_gray.rows;
int width = dst_gray.cols;
//读写像素

//
for (int i = 0; i < hight; i++)
{
	for (int j = 0; j < width; j++)
	{
		int gray = dst_gray.at<uchar>(i,j);
		dst_gray.at<uchar>(i, j) = 255 - gray;//只适用于单通道
		//cout << gray << endl;
	}
}

Mat dst;
dst.create(srcImg.size(), srcImg.type());
hight = dst.rows;
width = dst.cols;
int nc = dst.channels();
//bitwise_not(srcImg,dst);
//bitwise_not(src,dst)  函数的实现
for (int rows = 0; rows < hight; rows++)
{
	for (int cols = 0; cols < width; cols++)
	{
		if (nc==1)
		{
			int gray = dst_gray.at<uchar>(rows, cols);
			dst_gray.at<uchar>(rows, cols) = 255 - gray;
		}
		else if (nc==3)
		{
			int b = srcImg.at<Vec3b>(rows, cols)[0];
			int g = srcImg.at<Vec3b>(rows, cols)[1];
			int r = srcImg.at<Vec3b>(rows, cols)[2];
			dst.at<Vec3b>(rows, cols)[0] = 255 - b;
			dst.at<Vec3b>(rows, cols)[1] =255-g;
			dst.at<Vec3b>(rows, cols)[2] =255-r;
			dst_gray.at<uchar>(rows, cols) = min(r, min(b, g));
		}
	}
}
namedWindow("dst11_grayImage Window", CV_WINDOW_AUTOSIZE);
imshow("dst11_grayImage Window", dst);

namedWindow("dst1_grayImage Window", CV_WINDOW_AUTOSIZE);
imshow("dst1_grayImage Window", dst_gray);
waitKey(0);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Photoshop 插件中使用 OpenCV Mat 读取数据,你需要先将 Photoshop 的图像数据转换成 OpenCVMat 对象,然后再进行像操作。 以下是一个简单的示例代码: ```c++ #include "PIGeneral.h" #include "PIFilter.h" #include "PIUSuites.h" #include "opencv2/opencv.hpp" // 定义宏,指定插件需要的 Photoshop Suite #define kPhotoshopSuite "photoshop.Photoshop" // 定义宏,指定插件需要的 OpenCV Suite #define kOpenCVSuite "opencvsample.OpenCV" // 定义宏,指定插件需要的 OpenCV 版本 #define kOpenCVVersion 3 // 定义宏,指定插件需要的 OpenCV 数据类型 #define kOpenCVDataType CV_8UC4 // 定义全局变量,用于存储 Photoshop Suite SPBasicSuite *sSPBasic = nullptr; // 定义全局变量,用于存储 Photoshop Suite PhotoshopSuite1 *sPS = nullptr; // 定义全局变量,用于存储 OpenCV Suite OpenCVSuite *sOpenCV = nullptr; // 定义函数,用于将 Photoshop 图像数据转换成 OpenCVMat 对象 cv::Mat PhotoshopImageToMat(PIImageData *imageData) { // 获取图像数据的宽度、高度、深度和通道数 int width = imageData->width; int height = imageData->height; int depth = imageData->depth; int channels = imageData->channels; // 创建 OpenCVMat 对象,并将 Photoshop 图像数据复制到 Mat 对象中 cv::Mat mat(height, width, kOpenCVDataType); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { // 计算像在数据中的偏移量 int offset = (y * width + x) * channels; // 将 Photoshop 图像数据复制到 Mat 对象mat.at<cv::Vec4b>(y, x)[0] = imageData->data[offset + 0]; mat.at<cv::Vec4b>(y, x)[1] = imageData->data[offset + 1]; mat.at<cv::Vec4b>(y, x)[2] = imageData->data[offset + 2]; mat.at<cv::Vec4b>(y, x)[3] = imageData->data[offset + 3]; } } // 返回转换后的 Mat 对象 return mat; } // 定义函数,用于处理 Photoshop 插件的主要逻辑 void DoFilter() { // 获取当前文档的图层 int16 layerCount = 0; sPS->GetDocumentLayerCount(&layerCount); if (layerCount <= 0) { return; } // 获取当前文档的激活图层 int16 activeLayerIndex = 0; sPS->GetActiveLayerIndex(&activeLayerIndex); if (activeLayerIndex < 0 || activeLayerIndex >= layerCount) { return; } // 获取当前文档的激活图层的图像数据 PIImageData imageData = { 0 }; sPS->GetLayerImageDataAndDesc(activeLayerIndex, &imageData, nullptr); // 将 Photoshop 图像数据转换成 OpenCVMat 对象 cv::Mat mat = PhotoshopImageToMat(&imageData); // 在 OpenCVMat 对象上进行像操作 // ... // 释放 Photoshop 图像数据和 OpenCVMat 对象 sPS->DisposeLayerImageData(&imageData); } // 定义函数,用于初始化插件 SPErr PlugInInit( SPInterfaceMessage *message ) { SPErr error = kSPNoError; // 获取 Basic Suite SPBasicSuite *sSPBasic = (SPBasicSuite *)message->basic; // 获取 Photoshop Suite if (sSPBasic->AcquireSuite(kPhotoshopSuite, kPhotoshopSuiteVersion1, (const void **)&sPS) != kSPNoError) { return kSPRuntimeError; } // 获取 OpenCV Suite if (sSPBasic->AcquireSuite(kOpenCVSuite, kOpenCVVersion, (const void **)&sOpenCV) != kSPNoError) { return kSPRuntimeError; } return error; } // 定义函数,用于释放插件 SPErr PlugInTerminate( SPInterfaceMessage *message ) { SPErr error = kSPNoError; if (sPS != nullptr) { sSPBasic->ReleaseSuite(kPhotoshopSuite, kPhotoshopSuiteVersion1); sPS = nullptr; } if (sOpenCV != nullptr) { sSPBasic->ReleaseSuite(kOpenCVSuite, kOpenCVVersion); sOpenCV = nullptr; } sSPBasic = nullptr; return error; } // 定义函数,用于处理插件的入口点 DLLExport SPAPI int main( const char *caller, const char *selector, void *message) { SPErr error = kSPNoError; if (strcmp(selector, kSPInterfaceStartupSelector) == 0) { error = PlugInInit((SPInterfaceMessage *)message); } else if (strcmp(selector, kSPInterfaceShutdownSelector) == 0) { error = PlugInTerminate((SPInterfaceMessage *)message); } else if (strcmp(selector, kSPFilterSelector) == 0) { DoFilter(); } return error; } ``` 在上面的代码中,我们首先定义了一个 PhotoshopImageToMat 函数,用于将 Photoshop 图像数据转换成 OpenCVMat 对象。该函数使用了 OpenCV 的 at 函数和 Vec4b 类型,这里的 Vec4b 表示 4 个字节的像数据。 然后我们在 DoFilter 函数中获取了当前文档的激活图层的图像数据,并将其转换成 OpenCVMat 对象。在 Mat 对象上进行像操作后,我们需要释放 Photoshop 图像数据和 OpenCVMat 对象,以避免内存泄漏。 最后,我们将插件的入口点定义为 main 函数,并根据不同的 selector 处理不同的任务。在我们的例子中,我们只处理了 kSPFilterSelector,也就是 Photoshop 的滤镜操作。如果你想要处理其他的操作,你需要相应地修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值