Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.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
opencvhsv:iOS与Python和C++;_Ios - Fatal编程技术网

opencvhsv:iOS与Python和C++;

opencvhsv:iOS与Python和C++;,ios,Ios,我正在使用OpenCV 3.4.4将图像从BGR转换为HSV。在Python和C++中,结果完全一样,但IOS产生不同的值。问题的关键在于,IOS中的色调不同,Python和C++产生了完全相同的值。 用python import cv2 image = cv2.imread("monkey.jpg") hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV) print(hsv[0][0]) # [30,132,135] 在C中++ #include <

我正在使用OpenCV 3.4.4将图像从BGR转换为HSV。在Python和C++中,结果完全一样,但IOS产生不同的值。问题的关键在于,IOS中的色调不同,Python和C++产生了完全相同的值。 用python

import cv2

image = cv2.imread("monkey.jpg")
hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
print(hsv[0][0])
# [30,132,135]
在C中++

#include <opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

Mat image,hsv;
image = imread("monkey.jpg")
cvtColor(image,hsv,COLOR_BGRHSV);
cout << hsv.at<cv::Vec3b>(0,0) << endl;
// [30,132,135]
#包括
#包括
使用名称空间std;
使用名称空间cv;
Mat图像,hsv;
image=imread(“monkey.jpg”)
CVT颜色(图像、hsv、彩色);

cout我将发布我自己问题的答案

当我们在iOS中将图像读取为UIImage时,它是RGB,而不是BGR。这很简单,但与我们通常使用python/C++中的cv2.imread读取图像时相反。所以我需要做的是:

UIImage -> RGB -> BGR -> HSV

那么,所有三个(Python,C++,Objul-C/C++)都有相同的[30132135 ] < /P> 这是我在OpenCVWrapper.mm文件中的代码:

#import <opencv2/opencv.hpp>
#import "OpenCVWrapper.h"
#import <opencv2/imgcodecs/ios.h>
#import <UIKit/UIKit.h>
#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

@implementation OpenCVWrapper

+ (void)getHSV:(UIImage *)image {
    cv::Mat mat;
    cv::Mat hsv;
    UIImageToMat(image, mat);
    cv::cvtColor(mat, hsv, cv::COLOR_BGR2HSV);

    std::cout << hsv.at<cv::Vec3b>(0,0) << std::endl;

@end
+ (void)getHSV:(UIImage *)image {
    cv::Mat matRGB, matBGR, hsv;
    UIImageToMat(image,matRGB);
    //std::cout << mat.at<cv::Vec3b>(0,0) << std::endl;
    cv::cvtColor(matRGB,matBGR,cv::COLOR_RGB2BGR);
    //std::cout << matBGR.at<cv::Vec3b>(0,0) << std::endl;
    cv::cvtColor(matBGR,hsv,cv::COLOR_BGR2HSV);
    std::cout << hsv.at<cv::Vec3b>(0,0) << std::endl;
}
+(void)getHSV:(UIImage*)图像{
cv::matRGB、matBGR、hsv;
UIImageToMat(图像,matRGB);

//大多数HSV色调范围是0到360。请参阅。我不确定Apple使用的是什么。但OpenCV使用0到180。(按0到360的1/2进行缩放以将值保持在8位范围内)。请参阅位于的蓝色线下的注释。然而,我本以为这意味着对于我使用的特定图像,我在iOS OpenCV包装器实现中使用for循环检查了范围。色调范围为0-179。如果存在,我必须使用苹果的官方文档对此进行双重检查。如果色调范围与OpenCV相同,为什么会出现这种情况在iOS OpenCV包装中为90,而在其他语言中为30?其他语言使用0到360,而不是0到180。