【问题标题】:Creating bigger image out of small image Mat [opencv, background subtraction]从小图像Mat中创建更大的图像[opencv,背景减法]
【发布时间】:2016-03-19 06:11:20
【问题描述】:

我有一张图片i1。我应该创建另一个大小为(image.rows*3image.cols*3)的 Mat m1。 在m1 中,我应该按以下方式填充像素值。 (请看图片):

这是我的代码-

#include <highgui.h>  
#include "opencv2/opencv.hpp"  
#include <fstream>  
using namespace cv;
static Mat NeurMap1, NeurMap2, NeurMap3, frame, hsv_Frame;
std::ofstream myfile;
void InitializeNeurMap(cv::Mat Channel[3])
{  
            int i=0,j=0,m_i=0,m_j=0, t1=0, t2=0;

    for(i=0; i < frame.rows; i++)
    {
        for(j=0;j < frame.cols;j++)
        {
            t1= i*n+1; t2 = j*n+1;
            for(m_i=t1-1; m_i <= t1+1;m_i++)
            {
                for(m_j=t2-1; m_j <= t2+1; m_j++)
                {
                    NeurMap1.at<uchar>(m_i,  m_j)= frame.at<uchar>(i,j); 
                }
            }
        }
    }
    std::cout<<m_j;
    myfile<<frame;

}
int main()
{

    myfile.open("NeurMaptext.txt");
    String filename="BootStrap/b%05d.bmp";// sequence of frames are read
    VideoCapture cap(filename);
    if(!cap.isOpened())  // check if we succeeded
        return -1;
    namedWindow("edges",1);
    //namedWindow("frames",1);
    Mat Channel[3];
    cap>>frame;
    NeurMap1 = Mat::zeros(frame.rows*n, frame.cols*n, frame.type());
    InitializeNeurMap(Channel);
    imshow("edges",NeurMap1);waitKey(33);
    for(;;)
    {
        cap>>frame;
        if(frame.empty())
            break;
    }   

    system("pause");
    return 0;
}

输入图像为 RGB[160*120]。为什么我没有得到上面链接中给出的输出图像中的列?

【问题讨论】:

  • 您要调整图片大小吗?
  • 没有。我需要基于神经网络执行背景减法。我正在根据本文cvprlab.uniparthenope.it/publications/… 中给出的框架初始化神经元图
  • 循环在InitializeNeurMap()函数中作用于单通道图像,所以要么改变循环,要么将单通道图像传递给InitializeNeurMap()。

标签: c++ opencv image-processing background-subtraction


【解决方案1】:

您可以通过传递INTER_NEAREST 参数来调用resize(),即使用最近邻插值法。

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main()
{
    unsigned char data[] = { 1, 2, 3, 4, 5, 6 };
    Mat img(2, 3, CV_8UC1, data);
    cout << img << endl;

    Mat res(6, 9, CV_8UC1);
    resize(img, res, res.size(), 0, 0, INTER_NEAREST);
    cout << res << endl;

    return 0;
}

你会得到:

【讨论】:

  • 感谢您的回复,我得到了输出图像,但是当我检查文件中的输出图像像素时。我看到每个原始帧像素在输出帧文件中都没有显示为 3*3 ?
  • @MohitRustagi 一个像素还是一个像素,除了输出图像,9个像素对应输入图像中的一个像素。
  • 我需要每个像素的每 3*3 在一起,因为我需要根据该像素的 3*3 网格中的像素值更新像素。
  • @MohitRustagi 您可以在更新它们时使用 ROI 区域。查看here
  • 内部是一起表示的吗?
【解决方案2】:

在你得到三个只有三分之一的图像填充,因为,可能你正在将 3 通道(颜色)图像传递给函数并将其视为单通道图像。所以把上面的代码改成,

void InitializeNeurMap(cv::Mat Channel[3])
{
 for(int i=0; i < frame.rows; i++){
  for(int j=0;j < frame.cols;j++){

   for(int k=0;k<n;k++){
    for(int l=0;l<n;l++){
     NeurMap1.at<Vec3b>(i*n+k,j*n+l)[0] = frame.at<Vec3b>(i,j)[0]; //Access Blue channel
     NeurMap1.at<Vec3b>(i*n+k,j*n+l)[1] = frame.at<Vec3b>(i,j)[1];//Access green channel
     NeurMap1.at<Vec3b>(i*n+k,j*n+l)[2] = frame.at<Vec3b>(i,j)[2]; //Access red channel
    }
   }
  }
 }
 myfile<<frame;
}

看结果

【讨论】:

  • 感谢您的回复。我尝试了代码,它的工作原理与resize() 相同。它并没有将每个像素的 3*3 网格放在一起。
  • 它将创建 ecah 像素的 3x3 网格作为您的示例图像,如果您想一起访问 3x3 网格,则必须使用 ROI。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多