OpenCV MAT 数据类型宏定义

CV_32FC2:  13

CV_32SC2:  12
CV_8UC1:  0

CV_64FC1:  6

 

S--代表---signed int---有符号整形
U--代表--unsigned int--无符号整形
F--代表--float---------单精度浮点型

C<n>表示n通道

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值