吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 738|回复: 2
收起左侧

[讨论] 如何将C++ opencv图像数据转到易语言字节集类型

  [复制链接]
futureflsl 发表于 2023-6-16 10:40
C++ 端DLL

#pragma once
#include<iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
cv::Mat img = cv::imread("D:\\67.jpg");//图片分辨率是1416 × 804
extern "C" __declspec(dllexport) uchar* WINAPI Show()
{
        return img.data;

}



易语言调用
.版本 2

.子程序 _按钮1_被单击
.局部变量 图像数据, 字节集
.局部变量 图像长度, 整数型
.局部变量 图像指针, 整数型

图像指针 = 显示图像 ()
图像数据 = 指针到字节集 (图像指针, 1416 × 804 × 3)
写到文件 (“result.jpg”, 图像数据)



但是报错图片不对哦,大佬能指点江山?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

tuoluo348 发表于 2023-6-16 16:03
chat gpt

该问题可能出在两处:

一是C++端DLL中将图像数据进行了转换,但易语言端没有正确接收和处理,导致生成的文件不是预期的图片。

二是Show函数返回的数据指针指向img的数据内存,但是可能会出现调用该函数时img已经被释放的情况,此时指针指向的内存将变得无效。因此,为了防止这种情况,需要将img拷贝一份,交给Show函数处理。

以下是修改后的代码,你可以参考一下:

C++端DLL:
```cpp
#pragma once
#include<iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;

// 传入Mat数据的地址和长度,将Mat数据复制到缓冲区,并返回缓冲区的指针
extern "C" __declspec(dllexport) uchar* WINAPI Show(uchar* data, int width, int height, int channels)
{
    cv::Mat img(height, width, CV_MAKETYPE(CV_8U, channels));
    memcpy(img.data, data, width * height * channels);
    cv::imshow("img", img);//调试用

    return img.data;
}
```

易语言端:
```vb
.版本 2

.局部变量 图像数据, 字节集
.局部变量 图像长度, 整数型
.局部变量 图像指针, 整数型

' 加载DLL并获取Show函数
加载扩展库("test.dll")
Show函数=取函数地址("test.dll", "Show")

' 读取图片数据
图像数据 = 读入字节集("D:\67.jpg")
宽 = 1416
高 = 804
通道数 = 3

' 调用Show函数并将返回的指针转换成字节集
图像指针 = 调用DLL函数(Show函数, 图像数据, 宽, 高, 通道数)
图像长度 = 宽 * 高 * 通道数
图像数据 = 指针到字节集(图像指针, 图像长度)

' 将字节集写入文件
写入字节集("result.jpg", 图像数据)
```
 楼主| futureflsl 发表于 2023-6-17 06:16
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-10 21:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表