OpenCV损坏4000x3040分辨率以上的HQ Rapsicam数据?

yc0p9oo0  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(108)

问题

当我使用OpenCV拍摄宽度大于4000像素的图像时,使用高质量的picam,图像数据似乎已损坏(偏移)。

更多详细信息

如前所述,当我使用OpenCV在超过4000像素宽的分辨率时,我不能得到一个好的图像。我知道硬件不是问题,因为当我使用raspistill命令时,我可以得到一个干净的全分辨率(4056 x3040)图像:
sudo raspistill -o testing.tiff -w 4056 -h 3040
下面是raspistill的清晰输出:
4056x3040 image - Clean Image produced by raspistill command
我可以在Python中使用OpenCV捕捉图像:

import cv2 as cv

def main():
    cap = cv.VideoCapture("/dev/video2", cv.CAP_V4L2)
    cap.set(cv.CAP_PROP_FRAME_WIDTH, 4056)#works fine up to 4000
    cap.set(cv.CAP_PROP_FRAME_HEIGHT, 3040)

    if not(cap.isOpened()):
        print("could not open video device")
    else:
        print("cap opened")

    ret, frame = cap.read()
    if(ret):
        cv.imwrite("./test_im.jpg", frame)
        print("image saved")
    else:
        print("no capture data returned")
    

if __name__ == "__main__":
    main()

或者我可以用C++在OpenCV中捕获:

#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char *argv[]){
    cv::Mat frame;
    cv::VideoCapture cap("/dev/video2", cv::CAP_V4L2);

    cap.set(cv::CAP_PROP_FRAME_WIDTH, 4056);
    cap.set(cv::CAP_PROP_FRAME_HEIGHT, 3040);

    if(cap.isOpened() == false){
        std::cout << "cap not opened" << std::endl;
    }
    else{
        std::cout << "cap opened" << std::endl;
    }
    cap >> frame;

    if(frame.empty()){
        std::cout << "empy frame";
    }
    else{
        std::cout << "successfully captured image" << std::endl;
        cv::imwrite("test.tiff", frame);
    }
}

结果是相同的任何方式。
以下是OpenCV的损坏输出:
4056x3040 image - Corrupted and captured by OpenCV
在我看来,好像是捕获的时间出了问题。我保存它的格式也没有什么不同。我试过.png、.jpg和. tiff。结果总是一样。重新启动后,结果仍然一样。
如果我将所需的捕获分辨率降低到4000 x3040,那么我就可以成功地进行捕获。以下是结果:
4000x3040 image - successfully captured by OpenCV
我不知道为什么会发生这种情况。真的很感激任何帮助!让我知道如果有任何其他信息可能是有用的!

系统

  • 树莓派4 B与4GB内存.
  • 高品质Picam
  • 运行Ubuntu 20.04
  • OpenCV 4.5.5版本
8cdiaqws

8cdiaqws1#

我确定这个问题与Raspberry Pi和OpenCV所需的必要缓冲区有关。我相信它与堆栈溢出的this答案有关。
因此,我能够通过降低分辨率来修复图像拖尾,我要求在长度和宽度上都是32的倍数,例如4032x3040(而不是4056X3040)。这让我得到了几乎全分辨率的图像,而且已经足够完成这项任务了。我不知道如何使用OpenCV和高质量的Raspicam获得全分辨率图像。

相关问题