qq_36524996 2017-11-24 14:30 采纳率: 0%
浏览 698

opencv中HSI读取视频不能成功,代码运行成功,结果出不来。

#include
//#include
#include
#include

using namespace std;
using namespace cv;

//-------------------------- RGB 模型 转换为 HSI 模型--------------------//
int main(){
VideoCapture capture(0);
printf("摄像头调用成功");
if(!capture.isOpened())

{

return -1;

}  
 //Mat special;
  while(1){
    Mat BGRImage,HSIImage,temp;              //存储每一帧的图像
    capture >>BGRImage ;       //读取当前帧
     if (!BGRImage.empty()) //判断当前帧是否捕捉成功 **这步很重要  
        imshow("name", BGRImage); //若当前帧捕捉成功,显示  
    else  
        cout<<"can not ";   
    //temp = BGRImage.clone();
    Mat fhsi;
//Mat BGRImage = imread("2.jpg");
HSIImage = Mat(Size(BGRImage.cols, BGRImage.rows), CV_8UC3);
imshow("video",BGRImage);
//namedWindow(",LeafBGRImage",CV_WINDOW_AUTOSIZE);
vector <Mat> channels;
split(HSIImage, channels);
Mat Hvalue = channels.at(0);
Mat Svalue = channels.at(1);
Mat Ivalue = channels.at(2);

for (int i = 0; i < BGRImage.rows; ++i)
    for (int j = 0; j < BGRImage.cols; ++j)
    {
        double H, S, I;
        int Bvalue = BGRImage.at<Vec3b>(i, j)(0);
        int Gvalue = BGRImage.at<Vec3b>(i, j)(1);
        int Rvalue = BGRImage.at<Vec3b>(i, j)(2);

        //求Theta =acos((((Rvalue - Gvalue) + (Rvalue - Bvalue)) / 2) / sqrt(pow((Rvalue - Gvalue), 2) + (Rvalue - Bvalue)*(Gvalue - Bvalue)));
        double numerator = ((Rvalue - Gvalue) + (Rvalue - Bvalue)) / 2;
        double denominator = sqrt(pow((double)(Rvalue - Gvalue), 2) + (Rvalue - Bvalue)*(Gvalue - Bvalue));
        if (denominator == 0)
            H = 0;
        else{
            double Theta = acos(numerator / denominator) * 180 / 3.14;
            if (Bvalue <= Gvalue)
                 H = Theta;
            else  H = 360 - Theta;
        }       
        Hvalue.at<uchar>(i, j) = (int)(H * 255 / 360); //为了显示将[0~360]映射到[0~255]

        //求S = 1-3*min(Bvalue,Gvalue,Rvalue)/(Rvalue+Gvalue+Bvalue);
        int minvalue = Bvalue;
        if (minvalue > Gvalue) minvalue = Gvalue;
        if (minvalue > Rvalue) minvalue = Rvalue;
        numerator = 3 * minvalue;
        denominator = Rvalue + Gvalue + Bvalue;
        if (denominator == 0)  S = 0;
        else{
            S = 1 - numerator / denominator;
        }
        Svalue.at<uchar>(i, j) = (int)(S * 255);//为了显示将[0~1]映射到[0~255]

        I= (Rvalue + Gvalue + Bvalue) / 3;          
        Ivalue.at<uchar>(i, j) = (int)(I);
    }

merge(channels, HSIImage);
namedWindow("HSI",CV_WINDOW_AUTOSIZE);
imshow("HSI", HSIImage);
  }
waitKey(0);
return 0;

}
图片说明

  • 写回答

1条回答 默认 最新

  • 玻璃心orz 2017-11-27 12:34
    关注

    看看是否安装了解码器,若已经安装了,看看是不是图像过大,

    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序