Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么CV::Mat图像的颜色空间错误(GBR而不是RGB或BGR)? 在Python中有一个模块,它将RGB发送给C++,并在那里被消耗。然而,无论我做什么,图像的颜色空间都是错误的。也就是说,我尝试将其转换为RGB,假设它仍然在BGR中(尽管在python中,它是通过执行以下操作故意转换为RGB的:返回img[:,:,::-1]并使用matplotlib可视化图像。),反之亦然,它们看起来都一样_C++_Opencv_Pybind11 - Fatal编程技术网

为什么CV::Mat图像的颜色空间错误(GBR而不是RGB或BGR)? 在Python中有一个模块,它将RGB发送给C++,并在那里被消耗。然而,无论我做什么,图像的颜色空间都是错误的。也就是说,我尝试将其转换为RGB,假设它仍然在BGR中(尽管在python中,它是通过执行以下操作故意转换为RGB的:返回img[:,:,::-1]并使用matplotlib可视化图像。),反之亦然,它们看起来都一样

为什么CV::Mat图像的颜色空间错误(GBR而不是RGB或BGR)? 在Python中有一个模块,它将RGB发送给C++,并在那里被消耗。然而,无论我做什么,图像的颜色空间都是错误的。也就是说,我尝试将其转换为RGB,假设它仍然在BGR中(尽管在python中,它是通过执行以下操作故意转换为RGB的:返回img[:,:,::-1]并使用matplotlib可视化图像。),反之亦然,它们看起来都一样,c++,opencv,pybind11,C++,Opencv,Pybind11,如下所示: 原始图像: 这是没有任何篡改的图像输出 这是从BGR2RGB使用颜色空间转换时的输出: cv::Mat img2; cv::cvtColor(img、img2、cv::COLOR_BGR2RGB); cv::imshow(标题+“类型:”+图像类型,img2); 这就是我尝试转换为RGB2BGR时得到的结果: cv::Mat img2; cv::cvtColor(img、img2、cv::COLOR_RGB2BGR); cv::imshow(标题+“类型:”+图像类型,img

如下所示:

原始图像:

这是没有任何篡改的图像输出

这是从BGR2RGB使用颜色空间转换时的输出:

cv::Mat img2;
cv::cvtColor(img、img2、cv::COLOR_BGR2RGB);
cv::imshow(标题+“类型:”+图像类型,img2);

这就是我尝试转换为RGB2BGR时得到的结果:

cv::Mat img2;
cv::cvtColor(img、img2、cv::COLOR_RGB2BGR);
cv::imshow(标题+“类型:”+图像类型,img2);

正如你所看到的,最后两个是相同的。所以我试着手动改变频道,看看是否能让它工作。代码片段:

cv::Mat img2;
cv::cvtColor(img、img2、cv::COLOR_RGB2BGR);
//cv::cvtColor(img、img2、cv::COLOR_BGR2RGB);
对于(int i=0;i
结果如下:

显然,这是RGB,一切看起来都很好,似乎图像是GBR格式的!我不知道是什么原因造成的

我还注意到,我必须做一个转换,否则下面的for循环会给我内存访问冲突!这对我来说很奇怪!在
cvtColor
中更改
BGR2RGB
RGB2BGR
不会产生任何效果,它们的作用相同

我还想知道是否有更好的方法将其引入正确的颜色空间,而不需要像我编写的那样使用硬件加速的for循环?因为这个操作需要快速,但是使用我现有的解决方案一点都不好

编辑 顺便说一下,这是我在C++中调用的Python函数:

def detect_和_align_all(pil_img):
“”“获取输入图像,并返回作为rgb图像列表对齐的所有面
"""
B盒、地标=检测面(pil\U img)
#转换为ndarray,然后将rgb转换为bgr
cv_img=np.array(pil_img)[:,:,::-1].copy()
img_列表=[]
对于地标中的地标:
img=对齐面(cv\U img,地标)
img_list.append(img[:,:,::-1])
返回img_列表
align_face
最终称之为:

返回cv2.warpAffine(cv\u img,tfm,(裁剪尺寸[0],裁剪尺寸[1]))
更新1

这是我使用PybDun11:

发送C++到Python的图像的片段(从这里取来)。
py::dtype determinate\u np\u dtype(int-depth)
{
开关(深度)
{
案例CV_8U:返回py::dtype::of();
案例CV_8S:返回py::dtype::of();
案例CV_16U:返回py::dtype::of();
案例CV_16S:返回py::dtype::of();
案例CV_32S:返回py::dtype::of();
案例CV_32F:返回py::dtype::of();
案例CV_64F:返回py::dtype::of();
违约:
抛出std::无效的_参数(“不支持的数据类型”);
}
}
标准::矢量确定形状(cv::Mat&m)
{
如果(m.通道()==1){
返回{
静态浇铸(m.rows)
静态铸造(m.cols)
};
}
返回{
静态浇铸(m.rows)
静态铸造(m.cols)
,静态播放(m.通道()
};
}
py::胶囊制作胶囊(cv::Mat&m)
{
返回py::胶囊(新cv::垫(m)
,[](void*v){删除重新解释(v);}
);
}
py::阵列材料到阵列材料(cv::材料和材料)
{
如果(!m.isContinuous()){
throw std::无效的_参数(“仅支持连续垫”);
}
返回py::array(确定\u np\u数据类型(m.depth())
,确定_形(m)
,m.data
制成胶囊(m);
}
使用方法如下:

py::作用域_解释器保护{};
自动模块=py::模块::导入(“MyPackage.align_faces”);
自动对齐器=module.attr(“align_all”);
自动pil_转换器=module.attr(“cv_to_pil”);
自动img=cv::imread(“image1.jpg”);
自动img_pil=pilConvertor(材料至阵列(img));
自动img_面_列表=对准器(img_pil);
更新2 在评论中,由于@ DanMasek,通过将图片拷贝存储在Python端,在将它们发送回C++之前,解决了上述问题。然而,正如Ext3h在评论中指出的,图像中也有一个伪影,即使在最新的更改之后也没有消失

我在Python和C++中使用了两个图像(BGR模式),使用了<代码> imc> <代码>,这里显示的工件在这些图像中没有显示出来。然而,这两幅图像之间有一点不同。与Python版本相比,CPP映像有点放大(它们都使用了非常相同的函数(实际上C++调用了非常相同的Python模块))。Python版本的大小也更大:

cpp图像(大小:5492字节):

Python映像(大小:(5587字节)


这里的问题是什么?我使用的代码没有改变任何类型的跨步/偏移,事实上)那么是什么导致了这个问题呢?

我认为您的手动尝试中有一个错误,因为当您阅读第三行中的
[2]
时,由于第一行的原因,您发现它等于
[0]
。您应该使用临时变量来保存旧的
[2]
值。您确定没有在某个地方引入意外的off吗?在
RGB
和意外地将其解释为
GBR
之间只有一个字节偏移量,后者还包括