2144|3

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【Luckfox幸狐 RV1106 Linux 开发板使用】opencv-mobile 使用 [复制链接]

 
本帖最后由 0x4C 于 2024-2-20 14:05 编辑

    看官方教程提供了opencv-mobile的使用,简单易用,浅尝一下

    官方教程: opencv-mobile | LUCKFOX WIKI

1、基本测试

    创建一个文件夹

mkdir opencvMobile
cd  opencvMobile/

   下载并解压包,放到创建的文件夹下面

    在文件夹下创建新的文件 vi CMakeLists.txt 添加内容,将 <SDK Directory> 修改为自己的 SDK 路径,如 /home/luckfox/luckfox-pico/ 

project(opencv-mobile-test)
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)

SET(CMAKE_C_COMPILER "<SDK Directory>/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc")
SET(CMAKE_CXX_COMPILER "<SDK Directory>/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-g++")

set(OpenCV_DIR "${CMAKE_CURRENT_SOURCE_DIR}/opencv-mobile-4.8.1-luckfox-pico/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(opencv-mobile-test main.cpp)

target_link_libraries(opencv-mobile-test ${OpenCV_LIBS})

    创建main vi main.cpp

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include <unistd.h>   // sleep()

int main()
{
    cv::VideoCapture cap;
    cap.set(cv::CAP_PROP_FRAME_WIDTH, 320);
    cap.set(cv::CAP_PROP_FRAME_HEIGHT, 240);
    cap.open(0);

    const int w = cap.get(cv::CAP_PROP_FRAME_WIDTH);
    const int h = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
    fprintf(stderr, "%d x %d\n", w, h);

    cv::Mat bgr[9];
    for (int i = 0; i < 9; i++)
    {
        cap >> bgr[i];

        sleep(1);
    }

    cap.release();

    // combine into big image
    {
        cv::Mat out(h * 3, w * 3, CV_8UC3);
        bgr[0].copyTo(out(cv::Rect(0, 0, w, h)));
        bgr[1].copyTo(out(cv::Rect(w, 0, w, h)));
        bgr[2].copyTo(out(cv::Rect(w * 2, 0, w, h)));
        bgr[3].copyTo(out(cv::Rect(0, h, w, h)));
        bgr[4].copyTo(out(cv::Rect(w, h, w, h)));
        bgr[5].copyTo(out(cv::Rect(w * 2, h, w, h)));
        bgr[6].copyTo(out(cv::Rect(0, h * 2, w, h)));
        bgr[7].copyTo(out(cv::Rect(w, h * 2, w, h)));
        bgr[8].copyTo(out(cv::Rect(w * 2, h * 2, w, h)));

        cv::imwrite("out.jpg", out);
    }

    return 0;
}

    编译

mkdir build
cd build
cmake ..
make

    文件夹结构:

 

    在build下就生成了可执行程序

    将整个文件夹复制到开发板的root路径下

 

    执行 ./opencv-mobile-test

    得到图像

 

2、opencv4.9支持

    github上已经更新到opencv4.9了,浅尝一下区别 nihui/opencv-mobile: The minimal opencv for Android, iOS, ARM Linux, Windows, Linux, MacOS, WebAssembly (github.com)

    下载对应的包

    解压后也放到刚才的文件夹下,删除build文件夹

    修改camkelists.txt 

    

 

    其余步骤相同

    使用的做设备 luckfox-pico max + sc3336

    4.8.1下的输出

# ./opencv-mobile-test
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for jpeg decoder cvi
[  430.140795] stream_cif_mipi_id0: s_power 1, entity use_count 1
   devpath = /dev/video11
   driver = rkisp_v7
   card = rkisp_mainpath
   bus_info = platform:rkisp-vir0
   version = 20000
   capabilities = 84201000
   device_caps = 4201000
   fmt = UYVY 4:2:2  59565955
   fmt = Y/CbCr 4:2:2  3631564e
   fmt = Y/CrCb 4:2:2  3136564e
   fmt = Y/CrCb 4:2:0  3132564e
       size = 32 x 16  ~  2304 x 1296  (+8 +8)
   fmt = Y/CbCr 4:2:0  3231564e
   fmt = Y/CrCb 4:2:0 (N-C)  31324d4e
   fmt = Y/CbCr 4:2:0 (N-C)  32314d4e
rkaiq log level ff0
[  430.324185] stream_cif_mipi_id0: open video, entity use_countt 2
[  430.324391] stream_cif_mipi_id1: open video, entity use_countt 1
/dev/video11 does not support changing fps
rga_api version 1.9.1_[0]
[  430.338940] rkisp rkisp-vir0: first params buf queue
[  430.341360] rkisp_hw ffa00000.rkisp: set isp clk = 198000000Hz
[  430.341486] rkcif-mipi-lvds: sditf_reinit_mode, mode->rdbk_mode 0, mode->name rkisp-vir0, link_mode 1
[  430.343320] rkcif-mipi-lvds: stream320 x 240
[0] start streaming
[  430.343452] rockchip-mipi-csi2 ffa20000.mipi-csi2: stream on, src_sd: baffe55e, sd_name:rockchip-csi2-dphy0
[  430.343466] rockchip-mipi-csi2 ffa20000.mipi-csi2: stream ON
[  430.343542] rockchip-csi2-dphy0: dphy0, data_rate_mbps 506
[  430.343574] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:1, dphy0
[  430.343587] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:1, dphy0

[  439.456220] rkcif-mipi-lvds: stream[0] start stopping, total mode 0x2, cur 0x2
[  439.478307] rockchip-mipi-csi2 ffa20000.mipi-csi2: stream off, src_sd: baffe55e, sd_name:rockchip-csi2-dphy0
[  439.478359] rockchip-mipi-csi2 ffa20000.mMessageParser process loop exit!
ipi-csi2: stream OFF
[  439.480935] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream_stop stream stop, dphy0
[  439.480973] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:0, dpmpp[645]: mpp_buffer: mpi_buf_id = 136, dma_buf_fd = 5

mpp[645]: mpp: mClinetFd 7 open ok attr.chan_id 0


[  439.481019] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:0, dphy0
[  439.481238] rkcif-mipi-lvds: stream[0] stopping finished, dma_en 0x0
[  439.496563] stream_cif_mipi_id1: close video, entity use_count#
#  0
[  439.496651] stream_cif_mipi_id0: close video, entity use_count 1
[  439.497314] stream_cif_mipi_id0: s_power 0, entity use_count 0
[  439.516121] mpp_vcodec: 44: num_chan = 0
[  439.516219] mpp_vcodec: 103: chan_entry->handle 65722eb9, enc 65722eb9
[  439.516826] 755: MPP_ENC_SET_CFG in
[  439.516855] 524: MPP_ENC_SET_RC_CFG bps 0 [0 : 0] fps [1:1] gop 1

    4.9.0的输出

# ./opencv-mobile-test
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture cvi
this device is not whitelisted for capture v4l2 awispapi
[ 1681.086395] stream_cif_mipi_id0: s_power 1, entity use_count 1
   devpath = /dev/video11
   driver = rkisp_v7
   card = rkisp_mainpath
   bus_info = platform:rkisp-vir0
   version = 20000
   capabilities = 84201000
   device_caps = 4201000
   fmt = UYVY 4:2:2  59565955
   fmt = Y/CbCr 4:2:2  3631564e
   fmt = Y/CrCb 4:2:2  3136564e
   fmt = Y/CrCb 4:2:0  3132564e
       size = 32 x 16  ~  2304 x 1296  (+8 +8)
   fmt = Y/CbCr 4:2:0  3231564e
   fmt = Y/CrCb 4:2:0 (N-C)  31324d4e
   fmt = Y/CbCr 4:2:0 (N-C)  32314d4e
rkaiq log level ff0
[ 1681.269800] stream_cif_mipi_id0: open video, entity use_countt 2
[ 1681.270001] stream_cif_mipi_id1: open video, entity use_countt 1
/dev/video11 does not support changing fps
rga_api version 1.9.1_[0]
[ 1681.284710] rkisp rkisp-vir0: first params buf queue
[ 1681.287253] rkisp_hw ffa00000.rkisp: set isp clk = 198000000Hz
[ 1681.287302] rkcif-mipi-lvds: sditf_reinit_mode, mode->rdbk_mode 0, mode->name rkisp-vir0, link_mode 1
[ 1681.289425] rkcif-mipi-lvds: stream[0] start st320 x 240
reaming
[ 1681.289596] rockchip-mipi-csi2 ffa20000.mipi-csi2: stream on, src_sd: baffe55e, sd_name:rockchip-csi2-dphy0
[ 1681.289611] rockchip-mipi-csi2 ffa20000.mipi-csi2: stream ON
[ 1681.289661] rockchip-csi2-dphy0: dphy0, data_rate_mbps 506
[ 1681.289691] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:1, dphy0
[ 1681.289703] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:1, dphy0
[ 1690.398035] rkcif-mipi-lvds: stream[0] start stopping, total mode 0x2, cur 0x2
[ 1690.424739] rockchip-mipi-csi2 ffa20000.mipi-csi2: stream off, src_sd: baffe55e, sd_name:rockchip-csi2-dphy0
[ 1690.424791] rockchip-mipi-MessageParser process loop exit!
csi2 ffa20000.mipi-csi2: stream OFF
[ 1690.427185] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream_stop stream stop, dphy0
[ 1690.427235] rockchip-csi2-dphy csi2-dphmpp[740]: mpp_buffer: mpi_buf_id = 136, dma_buf_fd = 5

ympp[740]: mpp: mClinetFd 7 open ok attr.chan_id 0

0: csi2_dphy_s_stream stream on:0, dphy0
[ 1690.427297] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:0ioctl IOCTL_FREE_IOMMU_ADDR failed 9 Bad file descriptor
ioctl ION_IOC_FREE failed 9 Bad file descriptor
, dphy0
[ 1690.427546] rkcif# -mipi-lvds: stream[0] stopping finished, dma_en 0x0
[ 1690.439913] stream_cif_mipi_id1: close video, entity use_count 0
[ 1690.440016] stream_cif_mipi_id0: close video, entity use_count 1
[ 1690.440679] stream_cif_mipi_id0: s_power 0, entity use_count 0
[ 1690.459025] mpp_vcodec: 44: num_chan = 0
[ 1690.459126] mpp_vcodec: 103: chan_entry->handle 68c79227, enc 68c79227
[ 1690.459735] 755: MPP_ENC_SET_CFG in
[ 1690.459764] 524: MPP_ENC_SET_RC_CFG bps 0 [0 : 0] fps [1:1] gop 1

3、寻找最大色块

#include <iostream>
#include <vector> // 添加 vector 头文件
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

int main()
{
    Mat image = imread("test.jpg"); // 替换为您的图像路径
    Mat hsvImage;
    cvtColor(image, hsvImage, COLOR_BGR2HSV);

    // 定义红色范围
    Scalar lowerRed = Scalar(0, 100, 100);
    Scalar upperRed = Scalar(10, 255, 255);

    // 提取红色物体
    Mat redMask;
    inRange(hsvImage, lowerRed, upperRed, redMask);

    // 查找红色物体的轮廓
    std::vector<std::vector<Point>> contours;
    findContours(redMask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

    // 绘制红色物体的轮廓并计算中心坐标
    for (const auto& contour : contours)
    {
        drawContours(image, std::vector<std::vector<Point>>{contour}, -1, Scalar(0, 0, 255), 2);

        // 计算轮廓的中心坐标
        Moments mu = moments(contour, false);
        Point2f center = Point2f(mu.m10 / mu.m00, mu.m01 / mu.m00);

        // 在图像上绘制中心坐标
        circle(image, center, 5, Scalar(255, 255, 255), -1);

        // 输出中心坐标
        std::cout << "Red object center coordinates: (" << center.x << ", " << center.y << ")" << std::endl;
    }

    // 显示结果
    imshow("Red Objects", image);
    waitKey(0);

    return 0;
}

    将测试图片放到和程序同一路径下,执行 ./opencv-mobile-test 

    输出结果:

# ./opencv-mobile-test
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for jpeg decoder cvi
this device is not whitelisted for jpeg decoder cvi
Red object center coordinates: (nan, nan)
Red object center coordinates: (nan, nan)
Red object center coordinates: (245.15, 156.34)
imshow save image to Red Objects.pngwaitKey stub#

   

 

最新回复

是的,用别的图像库应该也可以   详情 回复 发表于 2024-2-23 09:36
点赞(1) 关注(2)
 
 

回复
举报

365

帖子

0

TA的资源

版主

沙发
 

这个opencv-mobile库精简到只能用rockchip isp的视频流,也就是只能插官方的摄像头

点评

也可以这么玩,不去调他的读流接口就行,用原生的mpp接口读完视频流,转opencv 的mat型数据就好啦,这样编解码就都是自己能够控制的。也就是只用opencv的处理部分  详情 回复 发表于 2024-2-21 12:04
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
LitchiCheng 发表于 2024-2-21 09:16 这个opencv-mobile库精简到只能用rockchip isp的视频流,也就是只能插官方的摄像头

也可以这么玩,不去调他的读流接口就行,用原生的mpp接口读完视频流,转opencv 的mat型数据就好啦,这样编解码就都是自己能够控制的。也就是只用opencv的处理部分

点评

是的,用别的图像库应该也可以  详情 回复 发表于 2024-2-23 09:36
 
 
 

回复

365

帖子

0

TA的资源

版主

4
 
0x4C 发表于 2024-2-21 12:04 也可以这么玩,不去调他的读流接口就行,用原生的mpp接口读完视频流,转opencv 的mat型数据就好啦,这样 ...

是的,用别的图像库应该也可以

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表