Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
C++ 对4个相邻像素进行减法后,始终为零_C++_Opencv - Fatal编程技术网

C++ 对4个相邻像素进行减法后,始终为零

C++ 对4个相邻像素进行减法后,始终为零,c++,opencv,C++,Opencv,我试图将中心像素与4个相邻像素的差值相加,然后用该差值替换原始像素。但它总是用零代替像素。我不知道我做错了什么。谢谢你的帮助 // newproject.cpp : Defines the entry point for the console application. #include "stdafx.h" #include "highgui.h" #include <stdio.h> #include <cv.h> #include <highgui.h>

我试图将中心像素与4个相邻像素的差值相加,然后用该差值替换原始像素。但它总是用零代替像素。我不知道我做错了什么。谢谢你的帮助

// newproject.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include "highgui.h"
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <conio.h>
#include <opencv2/imgproc/imgproc.hpp>  // Gaussian Blur
#include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat, Scalar)
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <conio.h>

using namespace cv;
using namespace std;

class frameprocessing{

Mat hsv_base;
MatND hist_base;

public:
    void whatever(Mat Frame)
    {
        for(int i=0;i<Frame.cols;i++)
            for(int j=0;j<Frame.rows;j++)
            {
                if(i==0&&j==0)
                {

                //  cout<<"Check 1"<<endl;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i)-(Frame.at<Vec3b>(j+1,i))+(Frame.at<Vec3b>(j,i)-Frame.at<Vec3b>(j,i+1))+(Frame.at<Vec3b>(j,i)-Frame.at<Vec3b>(j+1,i))+(Frame.at<Vec3b>(j,i)-Frame.at<Vec3b>(j,i+1)));

                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[2]/4;

                }
                else if(i==Frame.cols-1&&j==Frame.rows-1)
                {
                //  cout<<"Check 2"<<endl;
                    Frame.at<Vec3b>(j,i)=((Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i-1)+Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i-1)+Frame.at<Vec3b>(j,i)));
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[2]/4;
                }
                else if(i==Frame.cols-1&&j==0)
                {
                                          //cout<<"Check 3"<<endl;
                    Frame.at<Vec3b>(j,i)=((Frame.at<Vec3b>(j+1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i-1)+Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j+1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i-1)+Frame.at<Vec3b>(j,i)));
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[2]/4;
                }
                else if(i==0&&j==Frame.rows-1)
                {
                //  cout<<"Check 4"<<endl;
                    Frame.at<Vec3b>(j,i)=((Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i+1)+Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i+1)+Frame.at<Vec3b>(j,i)));
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[2]/4;
                }
                else if(i==0)
                {
            //      cout<<"Check 5"<<endl;
                    Frame.at<Vec3b>(j,i)=((Frame.at<Vec3b>(j+1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i+1)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i+1)-Frame.at<Vec3b>(j,i))+((Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))));
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[2]/4;

                }
                else if(j==0)
                {
            //      cout<<"Check 6"<<endl;
                    Frame.at<Vec3b>(j,i)=((Frame.at<Vec3b>(j+1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j+1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i+1)-Frame.at<Vec3b>(j,i)+(Frame.at<Vec3b>(j,i-1)-Frame.at<Vec3b>(j,i))));
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[2]/4;
                }
                else if(i==Frame.cols-1)
                {
            //      cout<<"Check 7"<<endl;
                    Frame.at<Vec3b>(j,i)=((Frame.at<Vec3b>(j+1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))+((Frame.at<Vec3b>(j,i-1)-Frame.at<Vec3b>(j,i)))+((Frame.at<Vec3b>(j,i-1)-Frame.at<Vec3b>(j,i))));
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[2]/4;

                }
                else if(j==Frame.rows-1)
                {
            //      cout<<"Check 8"<<endl;

                    Frame.at<Vec3b>(j,i)=((Frame.at<Vec3b(j,i+1)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))+((Frame.at<Vec3b>(j,i-1)-Frame.at<Vec3b>(j,i))));
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[2]/4;
                }
                else
                {

                    Frame.at<Vec3b>(j,i)=((Frame.at<Vec3b>(j-1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j+1,i)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i+1)-Frame.at<Vec3b>(j,i))+(Frame.at<Vec3b>(j,i-1)+Frame.at<Vec3b>(j,i)));
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[0]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[1]/4;
                    Frame.at<Vec3b>(j,i)=(Frame.at<Vec3b>(j,i))[2]/4;
                    Vec3d value = Frame.at<Vec3b>(j,i);
                    cout<<value[0]<<endl;
                    cout<<value[1]<<endl;
                    cout<<value[2]<<endl;
                }   
            }
            //hell(Frame);
    }
 };
 class video{   

    Mat frame;
    string filename;
    double dWidth;
    double dHeight;

public:
    video()
    {

    }

    video(string videoname)
    {
        vector<Mat> videoframes;
        filename = videoname;
        VideoCapture capture(filename); 

        if( !capture.isOpened() )
        {
            exit(0);
        }

        dWidth   = capture.get(CV_CAP_PROP_FRAME_WIDTH); //get the width of frames of the video
        dHeight = capture.get(CV_CAP_PROP_FRAME_HEIGHT); //get the height of frames of the video
        frameprocessing obj;

        for( ; ; )
        {
            capture >> frame;
            if(frame.empty())
                break;

    //      Mat tmp=frame.clone();
            obj.whatever(frame);
    //      obj.hsv_histogram(frame);
    //      videoframes.push_back(tmp);
        }
        //displayvideo(videoframes);
        //writer(videoframes);
    }


};

int _tmain(int argc, _TCHAR* argv[])
{
    video obj("video.avi");
//newproject.cpp:定义控制台应用程序的入口点。
#包括“stdafx.h”
#包括“highgui.h”
#包括
#包括
#包括
#包括
#包括
#包括//高斯模糊
#包括//基本OpenCV结构(cv::Mat、Scalar)
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
类框架处理{
Mat hsv_底座;
MatND hist_基地;
公众:
无效(垫架)
{

对于(int i=0;i而言,您似乎需要内核大小参数为1的Lapacian,请参见此处:

你们只需要在卷积后将结果除以4就可以得到正确的拉普拉斯算子

至于你的代码,我认为你应该使用不同的图像作为源和目标,你不能在原地这样做

class frameprocessing{

    Mat hsv_base;
    MatND hist_base;

public:
    void whatever(Mat Frame)
    {  
        Frame.convertTo(Frame,CV_32FC3);
        Mat newimage=Mat::zeros(Frame.size(),CV_32FC3);
        for (int j=1;j<Frame.rows-1;++j)
        {
            for (int i=1;i<Frame.cols-1;++i)
            {
                newimage.at<Vec3f>(j,i)=Frame.at<Vec3f>(j,i)-
                    0.25*Frame.at<Vec3f>(j+1,i)-
                    0.25*Frame.at<Vec3f>(j,i+1)-
                    0.25*Frame.at<Vec3f>(j-1,i)-
                    0.25*Frame.at<Vec3f>(j,i-1);
                    cout << newimage.at<Vec3f>(j,i) << endl;
            }
        }
        //imshow("result",newimage);
        //cv::waitKey(30);
    }
};
class video{   

    Mat frame;
    string filename;
    double dWidth;
    double dHeight;

public:
    video()
    {

    }

    video(string videoname)
    {
        vector<Mat> videoframes;
        filename = videoname;
        VideoCapture capture(filename); 

        if( !capture.isOpened() )
        {
            exit(0);
        }

        dWidth   = capture.get(cv::CAP_PROP_FRAME_WIDTH); //get the width of frames of the video
        dHeight = capture.get(cv::CAP_PROP_FRAME_HEIGHT); //get the height of frames of the video
        frameprocessing obj;

        for( ; ; )
        {
            capture >> frame;
            if(frame.empty())
                break;

            //      Mat tmp=frame.clone();
            obj.whatever(frame);
            //      obj.hsv_histogram(frame);
            //      videoframes.push_back(tmp);


        }
        //displayvideo(videoframes);
        //writer(videoframes);
    }


};

int main(int argc, char* argv[])
{
    namedWindow("result");
    video obj("D:\\ImagesForTest\\atrium.avi");
}
类框架处理{
Mat hsv_底座;
MatND hist_基地;
公众:
无效(垫架)
{  
帧转换到(帧,CV_32FC3);
Mat newimage=Mat::zeros(Frame.size(),CV_32FC3);

对于(intj=1;ji已经尝试制作新图像,但它没有显示任何输出新图像。at(j,i)=(Frame.at(j,i)-(Frame.at(j+1,i))+(Frame.at(j,i)-Frame.at(j,i+1))+(Frame.at(j,i)-Frame.at(j,i)-Frame.at(j,i)-Frame.at(j,i+1));Vec3b值=新图像;我可以在我的答案中添加代码。我认为您应该使用浮点值进行计算。卷积后,您可以将结果转换为您想要的任何类型,但请记住,您得到的结果是有符号的,有些值是负数。当我使用vec3f或vec3d时,它崩溃了。请帮助我