Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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
在OpenCV C+中拼接2幅图像后,移除图像的黑色部分+; 我在OpenCV C++中缝合了2幅图像,但是我知道图像中有一个黑色的部分,并想删除它。怎么走_C++_Image_Opencv_Image Processing_Image Stitching - Fatal编程技术网

在OpenCV C+中拼接2幅图像后,移除图像的黑色部分+; 我在OpenCV C++中缝合了2幅图像,但是我知道图像中有一个黑色的部分,并想删除它。怎么走

在OpenCV C+中拼接2幅图像后,移除图像的黑色部分+; 我在OpenCV C++中缝合了2幅图像,但是我知道图像中有一个黑色的部分,并想删除它。怎么走,c++,image,opencv,image-processing,image-stitching,C++,Image,Opencv,Image Processing,Image Stitching,这是我的图像输出: 想法是将每列的像素相加,然后迭代数据以构建新图像。如果列的值为零,则表示它是黑色的,因此我们忽略它,否则将列ROI连接到最终图像。以下是列像素的总和: 结果 我用Python实现了它,但您可以将类似的想法改编成C++ import cv2 import numpy as np # import matplotlib.pyplot as plt # Load image, convert to grayscale, and sum column pixels image

这是我的图像输出:


想法是将每列的像素相加,然后迭代数据以构建新图像。如果列的值为零,则表示它是黑色的,因此我们忽略它,否则将列ROI连接到最终图像。以下是列像素的总和:

结果

我用Python实现了它,但您可以将类似的想法改编成C++

import cv2
import numpy as np 
# import matplotlib.pyplot as plt

# Load image, convert to grayscale, and sum column pixels
image = cv2.imread('1.jpg')
h, w = image.shape[:2]
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
first_pass = True
pixels = np.sum(gray, axis=0).tolist()

# Build new image
for index, value in enumerate(pixels):
    if value == 0:
        continue
    else:
        ROI = image[0:h, index:index+1]
        if first_pass:
            result = image[0:h, index+1:index+2]
            first_pass = False
            continue
        result = np.concatenate((result, ROI), axis=1)

cv2.imshow('result', result)
cv2.imwrite('result.png', result)
# Uncomment for plot visualization
# plt.plot(pixels, color='teal')
# plt.show()
cv2.waitKey()

快速的方法是使用OpenCv的
cv::reduce
函数,并找到每列的最大值。它比求元素和要快。若列中的最大值为0,则表示该列为黑色

cv::reduce
的输入是2d数组:

[a b c]
[d e f]
[g h i]
as输出将得到一行向量的矩阵2d

[max(a,d,g) max(b,e,h) max(c,f,i)]
然后您需要找到截止指数-第一个非黑色列,并提取ROI:

cv::Mat img = imread("test.jpg");
cv::Mat out;
cv::reduce(img, out, 0, cv::REDUCE_MAX);
int cutOffIdx = 0;
for (int col = 0; col < out.cols; ++col) {
    const cv::Vec3b& vec = out.at<Vec3b>(0, col);
    if (vec[0] || vec[1] || vec[2]) {
        cutOffIdx = col;
        break;
    }
}
cv::imshow("test",img(cv::Rect(cutOffIdx,0,img.cols-cutOffIdx-1,img.rows)));
cv::waitKey(0);
cv::Mat img=imread(“test.jpg”);
cv::垫出;
cv::reduce(img,out,0,cv::reduce_MAX);
int cutoffix=0;
for(int col=0;col
注意:根据Nathance的回答,我刚刚用C++编写了代码:

#包括
#包括
使用名称空间std;
使用名称空间cv;
int main()
{
Mat img=imread(“/your/image/directory/image.jpg”);
对于(int i=0;i我会这样做:

  • 灰度图像的阈值化

  • 查找图像中最外层的轮廓

  • 从轮廓图中找出最大的一个

  • 获取该轮廓的边界框

  • 按该边界框裁剪图像

以及代码(C++opencv):

matk,J,I=imread(“D:/1.jpg”,1);
CVT颜色(I、K、CV_bgr2灰色);
阈值(K,J,0,255,THRESH_二进制);
矢量等值线;
向量层次结构;
findContours(J、等高线、层次、外部检索、链近似无);#给出外部等高线
Mat tmp=Mat::zeros(I.size(),CV_8U);
int k=0;
双最大值=-1;
对于(size_t i=0;i最大值)
{
k=i;
最大值=面积;
}
}
drawContours(tmp,contours,k,Scalar(255,255,255),-1);#您可以对这行进行注释。我编写它只是为了显示过程
Rect r=cv::boundingRect(等高线[k]);
垫输出;
I(r).复制到(输出);
imshow(“0”,I);
imshow(“1”,J);
imshow(“2”,tmp);
imshow(“3”,输出);
等待键(0);

第一件事是写一些人们可以输入的代码。现在,只有两张图片。有人能对这些图片说些什么吗?写一个。
#include <iostream>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main()
{
    Mat img = imread("/your/image/directory/image.jpg");

    for(int i=0;i<img.cols;i++)
    {
        int black_cnt = 0;
      for(int j=0;j<img.rows;j++)
      {
         if(img.at<cv::Vec3b>(j,i)[0]==0)
             black_cnt++;
      }
      if(black_cnt==img.rows)
          continue;
      else
      {
          Rect roi(i,0,img.cols-i,img.rows);
          img = img(roi);
          break;
      }
    }    
    imshow("Result",img);        
    waitKey(0);        
    return 0;

}
Mat K,J,I = imread("D:/1.jpg",1);

cvtColor(I, K, CV_BGR2GRAY);
threshold(K, J, 0, 255, THRESH_BINARY);

vector<vector<Point>> contours;
vector< Vec4i > hierarchy;

findContours(J, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE); # Gives the outer contours

Mat tmp = Mat::zeros(I.size(), CV_8U);
int k = 0;
double max = -1;

for (size_t i = 0; i < contours.size(); i++) # Of course in this case, There is only one external contour but I write the loop for more clarification
{
    double area = contourArea(contours[i]);
    if (area > max)
    {
        k = i;
        max = area;
    }
}

drawContours(tmp, contours, k, Scalar(255, 255, 255), -1); # You can comment this line. I wrote it just for showing the procedure
Rect r = cv::boundingRect(contours[k]);

Mat output;
I(r).copyTo(output);

imshow("0", I);
imshow("1", J);
imshow("2", tmp);
imshow("3", output);
waitKey(0);