- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 CV_32S 类型的 OpenCV 垫,其中包含 >= -1 的整数值。我正在尝试访问底层 data pointer这是 uchar
类型的平面一维数组。
我想因为 int
是 4 字节 [32 位] 而 uchar
是 1 字节 [8 位] 我需要将数据解压缩为 int 类型,这最初是在 OpenCV Mat 结构中提供。
cv::Mat opencv_data; //! data of type CV_32 with both negative and positive values.
我将 opencv_data
的 uchar *data
指针传递给 cuda 内核。要将四个 uchars
解压缩为单个 int
,我执行以下操作。
int value = (uchar)opencv_data[index] |
(((uchar)opencv_data[index + 1]) << 8) |
(((uchar)opencv_data[index + 2]) << 16);
当 opencv_data 只有正值时,我在 value
中得到正确的解包值。但是,如果我在 opencv_data
中放入一个负数,上述解包会生成 value = -1
。
我不明白这个问题背后的原因,我需要帮助。
编辑:根据使用reinterpret_cast
的建议。更新代码如下,但对于负数结果仍然不正确。
//! for test only
cv::Mat test = cv::Mat(40, 60, CV_32S);
for (int j = 0; j < test.rows; j++) {
for (int i = 0; i < test.cols; i++) {
test.at<int>(j, i) = -2;
}
}
int INDICES_BYTE = test.step * test.rows;
uchar *data = reinterpret_cast<uchar*>(test.data);
for (int i = 0; i < INDICES_BYTE; i += 4) {
int index = reinterpret_cast<uchar>(data[i]) |
(reinterpret_cast<uchar>(data[i + 1]) << 8) |
(reinterpret_cast<uchar>(data[i + 2]) << 16) |
(reinterpret_cast<uchar>(data[i + 3]) << 32);
std::cout << index << "\n";
}
在 test
中,编辑的代码对正数产生正确的结果,但对负数不正确。
例如:对于 -2,结果是 16777215
最佳答案
看来您误解了一些概念。
openCV mat
将保存矩阵数据的内存分配地址存储在 uchar *
中。这并不意味着数据以任何方式进行了转换。如果您想直接访问与矩阵关联的数据,只需将指针转换为正确的类型并使用该转换指针即可。像这样:
#include <opencv2/core/core.hpp>
#include <iostream>
int main()
{
cv::Mat test = cv::Mat(4, 6, CV_32S);
for (int j = 0; j < test.rows; j++) {
for (int i = 0; i < test.cols; i++) {
test.at<int>(j, i) = -2*i;
}
}
int *p = reinterpret_cast<int*>(test.data);
for(int j=0; j<test.rows; ++j) {
for(int i=0; i<test.cols; ++i) {
std::cout << j << "," << i << " = " << p[i] << std::endl;
}
p += test.cols;
}
return 0;
}
关于从uchar到int的C++数据打包(包括正数和负数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39190502/
我有一些图像数据作为 uchar* .我需要将其作为 std::vector 运行处理,然后将其转换回来。我正在使用这段代码: unsigned char* buffer = inputImg.dat
我有一个浮点矩阵 a,我想访问点 (x,y) 处的元素,但我想将数据类型转换为 unsigned char。 point(x,y)中的 float 为652.759 我要使用的代码(基于Opencv)
我们在这里讨论了使用(或不使用)unsafe.Pointer 将指向字节数组的指针从 Go 传递到 C。 (不)使用 unsafe.Pointer() 的最大原因是什么?我会把一致性作为一个原因,因为
我正在尝试使用指针遍历 cv::Mat。所以我在我的函数中做了以下操作: template inline cv::Mat_ dct(const cv::Mat_& oBlock) { cv::
当我在 64 位机器上运行以下代码时(编译器 clang) typedef unsigned char byte; void foo ( byte* a ) { std::cout int
我正在尝试对两个字符串进行 uchar 比较和复制,基本上是 strcpy 和 strcmp,但这似乎永远不起作用。 typedef unsigned char uchar; uchar a[20]
我正在尝试设置一个 uchar 如下: uchar num = 0; //0 num <<= 1; //1 num |=1; num <<=1; //0
代码: unsigned char data[20][20] = {{50, 50....}, .... ....}; Mat speed(20, 20, data); 当我尝试访问 sp
我的 ODBC 日志中有以下行: (场景:pgAdmin4,在另一个名为 System Administration 的应用程序中通过 ODBC32 使用 PostgreSQL 服务器) System
我想知道如何在 C++/MFC 中将 UCHAR 数组转换为二进制字符串。 我用 Cstring 尝试了一些可能性,但它们没有用。请告诉我原因。 这是我试过的代码: UCHAR ucdata[256]
我有一个无符号字符数组,其值如下: u_char *t_header[4]; //filled with values 0x00000047,0x00000004,0x00000093,0x00000
在 C 中,在 Unix 环境(Plan9)中,我有一个数组作为内存。 uchar mem[32*1024]; 我需要该数组包含不同的字段,例如 int(整数)以指示可用内存的大小。所以,我试过这个:
这是将十六进制字符串转换为字节数组的代码,它工作正常但是当循环结束并且编译器到达函数末尾时它会抛出此错误:“变量‘uChar’周围的堆栈已损坏” void Cfsp::stringToHex(unsi
我有一个 JNI 函数,它返回一个 UChar 数组(来自 ICU4C 库),我想将其转换为 Java 字符数组,以便我可以从 Java 调用它。我不确定问题出在哪里,因为每当我访问这个 JNI 函数
嗨, 关于我之前的帖子,我解决了 SSE 中的比较操作。 但是在获得输出后,我观察到我的输出是浮点形式,而我的预期输出是 uchar 。 例如,我期望输出为 8,输出以 floatng 格式为 8.0
我正在编写一个将文本传递给库函数的程序。此函数期望文本参数的类型为unsigned char*。 那么我怎样才能正确地将字符串传递给该函数呢?我无法将现有的 char* 转换为 unsigned ch
如何将 uchar 转换为 int? 最佳答案 如果 uchar 是 unsigned char 的类型定义,那么很简单: unsigned char c = 'A'; int i = c; //au
问题很简单:sizeof((u_char)value) 返回 8。strlen 失败。如何获取uchar内容的长度? 尝试过 std::cout << "Data: " << (u_char *)da
我有一个需要发送的 uchar 缓冲区。无法转换为 char。 我有一个示例项目: send(SOCKET s, void *buf, size_t length) { return send(s,
我第一次使用 WinAPI,我有一个返回 UCHAR* 的函数,但我需要它作为 std:string,因为当我尝试将它打印为 UCHAR* 但当我这样做时它会打印出很多乱码。必须有一些简单的方法来解决
我是一名优秀的程序员,十分优秀!